2008-11-19 41 views
23

Tôi đang tìm một cái gì đó như alert(), nhưng điều đó không "tạm dừng" tập lệnh.Có cảnh báo JavaScript không tạm dừng tập lệnh không?

Tôi muốn hiển thị cảnh báo và cho phép lệnh tiếp theo, biểu mẫu submit(), để tiếp tục. Vì vậy, các trang sẽ được thay đổi sau khi cảnh báo được hiển thị, nhưng nó sẽ không chờ đợi cho đến khi người dùng đã nhấp OK.

Có điều gì như thế này hay chỉ là một trong những điều không thể?

Trả lời

44

Bạn có thể làm các cảnh báo trong một setTimeout (mà một thời gian chờ rất ngắn) như setTimeout là không đồng bộ:

setTimeout("alert('hello world');", 1); 

Hoặc để làm điều đó đúng bạn thực sự hiển thị sử dụng một phương pháp chứ không phải là một chuỗi thành setTimeout của bạn:

setTimeout(function() { alert('hello world'); }, 1); 

Nếu không bạn sẽ tự mình mở cuộc tấn công bằng JavaScript. Khi bạn chuyển một chuỗi, nó chạy qua hàm JavaScript eval.

+7

Không chuyển chuỗi thành setTimeout, chuyển hàm. setTimeout (function() {alert ('hello world');}) có nhiều chức năng đẹp hơn là các đối tượng mức độ đầu tiên trong Javascript – Gareth

+0

Vâng, tôi biết tôi nên thực hiện nó như một hàm thay vì chuỗi được đánh giá. –

+6

Giải pháp này không hoạt động đối với Chrome, cảnh báo sẽ tạm dừng tất cả tập lệnh trình duyệt ngay cả trong setTimeout. – Anas

1

Trong trường hợp này, sẽ thích hợp hơn khi sử dụng DHTML và JavaScript để tự động hiển thị thư, trong phần tử HTML đơn giản hoặc một thứ trông giống hộp thoại hơn (nhưng không phải). Điều đó sẽ cung cấp cho bạn sự kiểm soát mà bạn cần. Tất cả các khung công tác JavaScript chính (YUI, Dojo và các khung công tác khác) sẽ cung cấp cho bạn khả năng hiển thị thư không đồng bộ.

1

Không đáng tin cậy. Sử dụng div trên trang mới.

+0

Cần nó trước trang để người dùng biết dữ liệu của họ đang được gửi. –

+0

Sau đó, cách tốt nhất là gửi nó dưới nền cho một dịch vụ web trả về các cập nhật. Bằng cách đó bạn không cần phải thay đổi trang cho đến khi nó hoàn thành.setTimeout ("alert()") thường bị chặn: nó phụ thuộc vào tình huống của bạn cho dù đó có thể là một vấn đề. – Mark

2

Nó có thể không phải là những gì bạn đang tìm kiếm, nhưng nó có thể thích hợp để sử dụng window.status = 'foo'.

Tôi sử dụng điều này rất nhiều trong một trong các ứng dụng web của tôi cho mạng nội bộ. Ngoài ra, phương thức setTimeout cũng hoạt động, nhưng nó có thể chặn nếu trình duyệt bận trên một nhiệm vụ chuyên sâu. Tuy nhiên cập nhật thanh trạng thái luôn là ngay lập tức.

Điều này yêu cầu người xem phải có cài đặt javascript có thể thay đổi thanh trạng thái - luôn là trường hợp nếu đó là trang web đáng tin cậy.

+0

Ý tưởng hoàn toàn, nhưng không hiển thị rõ ràng. Tôi đang cố gắng ngăn người dùng nhấp lại vào liên kết, vì vậy họ không kết thúc gửi biểu mẫu nhiều lần (sẽ không làm hỏng dữ liệu, nhưng nó sẽ gây rối với đầu của người dùng vì họ không mong đợi biểu mẫu để gửi nhưng cần phải lưu dữ liệu). –

+0

điều gì đang thay đổi 'window.status' phải làm gì? –

3

Nếu đã sử dụng JQuery http://docs.jquery.com/UI/Dialog rất dễ sử dụng và phong cách độc đáo.

+6

Vâng, đã sử dụng cái này trước đây, nhưng tôi không muốn thêm tất cả mã phụ cho cái gì đó phải đơn giản. –

1

98% thời gian có cách di chuyển tập lệnh thư của bạn để nó gọi sau khi mọi thứ khác thực thi. Đối với 2% kia, tôi thích sử dụng các div nổi trông giống như thế này. Sau đó bạn có thể thay đổi CSS của bạn để phù hợp với phong cách của ứng dụng/trang web của bạn hoặc để làm cho nó trông giống như một cửa sổ popup tiêu chuẩn.

/*HTML*/ 
<div class="floatingDiv" id="msgBox" style="visibility:hidden"></div> 

/*javaScript*/ 
function openWindow(id){ 
"use strict"; 
document.getElementById(id).style.visibility = 'visible'; 
} 
function closeWindow(id){ 
"use strict"; 
document.getElementById(id).style.visibility = 'hidden'; 
} 
function myMsgBox(TITLE,MESSAGE) { 
"use strict"; 
document.getElementById("msgBox").innerHTML = "<a href=\"javascript:closeWindow('msgBox')\" style=\"float:right\"><img src=\"imgs/close.png\" onmouseover=\"src='imgs/closeOver.png'\" onmouseout=\"src='imgs/close.png'\"/ alt=\"[close]\"></a><h2 style=\"text-align:center; margin-top:0px;\">" + TITLE + "</h2><hr><p align=\"left\">" + MESSAGE + "</p>"; 
openWindow("msgBox"); 
} 

/*CSS*/ 
.floatingDiv { 
position:absolute; 
z-index:10000; 
left:33%; 
top:250px; 
width:33%; 
background-color:#FFF; 
min-width:217px; 
text-align: left; 
border-radius: 10px 10px; 
border:solid; 
border-width:1px; 
border-color:#000; 
vertical-align:top; 
padding:10px; 

background-image: -ms-linear-gradient(top, #CCCCCC 0%, #FFFFFF 25px, #FFFFFF 100%); 
background-image: -moz-linear-gradient(top, #CCCCCC 0%, #FFFFFF 25px, #FFFFFF 100%); 
background-image: -o-linear-gradient(top, #CCCCCC 0%, #FFFFFF 25px, #FFFFFF 100%); 
background-image: -webkit-linear-gradient(top, #CCCCCC 0%, #FFFFFF 25px, #FFFFFF 100%); 
background-image: linear-gradient(to bottom, #CCCCCC 0%, #FFFFFF 25px, #FFFFFF 100%); 

box-shadow:3px 3px 5px #003; 
filter: progid:DXImageTransform.Microsoft.Shadow(color='#000033', Direction=145, Strength=3); 
} 
Các vấn đề liên quan