2012-07-30 117 views
23

Tôi đang phát triển một ứng dụng web sử dụng các hộp thoại JavaScript alert()confirm().Cách tắt "ngăn trang này tạo hộp thoại bổ sung"?

Làm cách nào để ngăn Chrome hiển thị hộp kiểm này?

Có một thiết lập tôi có thể sửa đổi?

Tôi biết tôi có thể sửa đổi mã nguồn nhưng tôi muốn nó để Chrome vẫn có thể tự động cập nhật.

Tôi không cần phải lo lắng về các trình duyệt khác vì ứng dụng chỉ chạy trong Chrome.

Tôi có quyền truy cập quản trị vào các máy (Windows) chạy ứng dụng.

Trả lời

38

Bạn không thể. Đó là tính năng của trình duyệt ở đó để ngăn các trang web hiển thị hàng trăm cảnh báo để ngăn bạn rời khỏi.

Tuy nhiên, bạn có thể xem xét các cửa sổ bật lên phương thức như jQuery UI Dialog. Đây là các hộp cảnh báo javascript hiển thị hộp thoại tùy chỉnh. Chúng không sử dụng hàm alert() mặc định và do đó, bỏ qua vấn đề bạn đang chạy hoàn toàn.

Tôi nhận thấy rằng một ứng dụng có nhiều hộp thư và xác nhận có một trải nghiệm người dùng tốt hơn nếu bạn sử dụng hộp thoại tùy chỉnh thay vì cảnh báo mặc định và xác nhận.

+1

Tôi không muốn thêm khung như jQuery. Ngoài ra, có rất nhiều hộp 'alert()' và 'confirm()' trong suốt mã. Tôi không muốn phát minh lại bánh xe, chỉ cần tắt hộp kiểm đó. –

+1

@DannyBeckett cũng có các phương thức JS thuần túy. JS có thể thực sự tối thiểu, nó chỉ để hiển thị/ẩn một div. Phần còn lại là CSS. Bạn có thể ghi đè các chức năng cảnh báo/xác nhận mặc định bằng chính bạn để bạn không phải thay đổi mã của mình. – sachleen

+2

Nhân tiện, bạn có thể dễ dàng ghi đè lên chức năng cảnh báo hiện có để tất cả các cuộc gọi đến 'alert()' sẽ sử dụng cửa sổ bật lên tùy chỉnh phương thức của bạn thay cho quảng cáo gốc. http://stackoverflow.com/questions/1729501/javascript-overriding-alert – sachleen

-1

Bạn nên cho phép người dùng thực hiện điều đó nếu họ muốn (và bạn không thể dừng họ).

Vấn đề của bạn là bạn cần phải biết rằng họ có và sau đó giả định rằng họ có nghĩa là OK, không hủy bỏ. Thay confirm(x) với myConfirm(x):

function myConfirm(message) { 
    var start = Number(new Date()); 
    var result = confirm(message); 
    var end = Number(new Date()); 
    return (end<(start+10)||result==true); 
} 
+0

Điều này không hoạt động. Hộp kiểm vẫn được hiển thị: http://i.imgur.com/WRMeDHj.png - đây là câu hỏi của tôi: http://jsfiddle.net/x2N5E/ –

7

Tôi biết tất cả mọi người là đạo đức chống lại điều này, nhưng tôi hiểu có những lý do của thực tiễn đùa nơi này là mong muốn. Tôi nghĩ Chrome đã có lập trường vững chắc về điều này bằng cách thực thi một khoảng thời gian tách biệt thứ hai bắt buộc giữa các thông điệp cảnh báo. Điều này mang lại cho khách truy cập chỉ đủ thời gian để đóng trang hoặc làm mới nếu họ bị kẹt trên trang web trò đùa gây phiền nhiễu.

Vì vậy, để trả lời câu hỏi của bạn, tất cả đều là vấn đề về thời gian. Nếu bạn cảnh báo nhiều lần mỗi giây, Chrome sẽ tạo hộp kiểm đó. Dưới đây là một ví dụ đơn giản của một workaround:

var countdown = 99; 
function annoy(){ 
    if(countdown>0){ 
     alert(countdown+" bottles of beer on the wall, "+countdown+" bottles of beer! Take one down, pass it around, "+(countdown-1)+" bottles of beer on the wall!"); 
     countdown--; 

     // Time must always be 1000 milliseconds, 999 or less causes the checkbox to appear 
     setTimeout(function(){ 
      annoy(); 
     }, 1000); 
    } 
} 

// Don't alert right away or Chrome will catch you 
setTimeout(function(){ 
    annoy(); 
}, 1000); 
+0

Bạn tìm thấy nó ở đâu trong giây lát hoặc bạn chỉ đoán? – DeadlyChambers

+2

Có vẻ như mozilla đang sử dụng khoảng 3 giây. https://bugzilla.mozilla.org/show_bug.cgi?id=61098#c209 – DeadlyChambers

+0

Cảm ơn bạn đã biết thông tin, thật tuyệt khi biết FF là 3 giây, tôi chỉ thử nghiệm mã này trong Chrome. Tôi đã phát hiện quy tắc 1 giây của Chrome thông qua một số thử nghiệm ngắn gọn, bạn có thể tự kiểm tra rằng bất kỳ khoảng thời gian nào dưới 1000ms khiến hộp kiểm xuất hiện, vì vậy nó không chỉ là thứ tôi tạo ra. Họ có thể thay đổi điều này rất tốt trong tương lai nhưng bây giờ chính xác là 1 giây. – CauselessEffect

8

Đây là những gì tôi đã kết thúc làm, vì chúng ta có một ứng dụng web mà có nhiều người dùng mà không phải là dưới sự kiểm soát của chúng tôi ... (@ DannyBeckett Tôi biết isn này' t một câu trả lời chính xác cho câu hỏi của bạn, nhưng những người đang nhìn vào câu hỏi của bạn có thể được giúp đỡ bởi điều này.) Bạn ít nhất có thể phát hiện nếu họ không nhìn thấy các hộp thoại. Có một vài điều bạn có thể muốn thay đổi nhất như thời gian hiển thị hoặc những gì bạn thực sự đang hiển thị. Hãy nhớ điều này sẽ chỉ thông báo cho người dùng rằng họ đã quản lý nhấp vào hộp kiểm nhỏ đó.

window.nativeAlert = window.alert; 
window.alert = function (message) { 
    var timeBefore = new Date(); 
    var confirmBool = nativeAlert(message); 
    var timeAfter = new Date(); 
    if ((timeAfter - timeBefore) < 350) { 
     MySpecialDialog("You have alerts turned off"); 
    } 
} 

window.nativeConfirm = window.confirm; 
window.confirm = function (message) { 
    var timeBefore = new Date(); 
    var confirmBool = nativeConfirm(message); 
    var timeAfter = new Date(); 
    if ((timeAfter - timeBefore) < 350) { 
     MySpecialDialog("You have confirms turned off"); 
    } 
    return confirmBool; 
} 

Rõ ràng là tôi đã đặt thời gian thành 3,5 mili giây. Nhưng sau một số thử nghiệm, chúng tôi chỉ có thể nhấp hoặc đóng các hộp thoại trong khoảng 5 mili giây cộng.

+0

Làm thế nào nó hoạt động? – locateganesh

+0

@locateganesh Nó hoạt động bằng cách loại bỏ tính xác thực và cảnh báo gốc. 350 là mili giây, và nó đang kiểm tra bao lâu xác nhận/cảnh báo được mở. Nếu nó được mở lâu hơn thì giả định rằng các cảnh báo/xác nhận không bị chặn. "MySpecialDialog" là một hộp thoại bạn đã tạo không sử dụng cảnh báo/xác nhận gốc của trình duyệt. Vì vậy, nếu bạn có một phương thức bootstrap hoặc một số điều như vậy nó sẽ mở ra và thông báo cho người dùng. – DeadlyChambers

3

Bạn nên sử dụng jquery-confirm thay vì cố gắng xóa hộp kiểm đó.

$.confirm({ 
    title: 'Confirm!', 
    content: 'Are you sure you want to refund invoice ?', 
    confirm: function(){ 
     //do something 
    }, 
    cancel: function(){ 
     //do something 
    } 
}); 
Các vấn đề liên quan