Tôi đã gặp phải một hành vi không mong muốn của JS setTimeout
khi các cửa sổ hộp thoại kiểu như alert
mở và tôi muốn biết lý do đằng sau nó.Tại sao các hộp tin nhắn phương thức JS tạm dừng đếm ngược trên setTimeout()?
Tôi dự kiến setTimeout (fn, 10000) có nghĩa là "kiểm tra thời gian hiện tại định kỳ và khi nó lớn hơn Now + 10000ms kích hoạt trình xử lý sự kiện sẽ gọi hàm 'fn' được truyền qua". Điều này sẽ là hợp lý, nhìn thấy cách chúng tôi vượt qua các biện pháp thời gian chờ là 'ms từ bây giờ'. Nhưng, rõ ràng, đếm ngược trên setTimeout
là đếm ngược theo nghĩa đen và sẽ bị tạm dừng trong khi cửa sổ phương thức mở.
setTimeout(function(){
//alert A
alert("10 seconds have passed for the first setTimeout")
}, 10000);
setTimeout(function(){
//alert B
alert("Wait for 15 seconds and press OK");
},1000);
Tôi mong chờ cảnh báo A để hiển thị ngay lập tức sau khi bạn đóng cảnh báo B (giả sử bạn chờ 15 giây. Làm như vậy), kể từ khi cảnh báo Đã hết thời gian chỉ trong vòng 10 giây và họ đã trôi qua. Thực tế, tuy nhiên, cho thấy đếm ngược để cảnh báo A chỉ đơn giản là tạm dừng trong khi cảnh báo B được mở và nó sẽ chỉ hiển thị sau khoảng. 9 giây nữa đã trôi qua sau khi bạn đã đóng cảnh báo B, cho dù B đã mở bao lâu.
Điều này có vẻ không hợp lý.
Cập nhật. Tôi chắc chắn không phải là người duy nhất bị nhầm lẫn ở đây, vì hành vi tạm dừng thời gian chờ này xảy ra trong Chrome và Internet Explorer, nhưng không phải Firefox. Firefox thực hiện hành vi mà tôi mong đợi - nếu bạn đợi 15 giây trên cảnh báo B - cảnh báo A xuất hiện tức thì bất cứ khi nào bạn đóng nó.
Đây là một trong những lý do tại sao 'alert's không tốt đặc biệt là với các chức năng thời gian. – soktinpk
@soktinpk Chúng tôi sử dụng những thứ như Bootbox cho cảnh báo trong các dự án của chúng tôi, nhưng đôi khi nó không được áp dụng, như khi bạn cần cảnh báo người dùng về dữ liệu chưa được lưu khi đóng trang. Tôi không thể tưởng tượng mọi người gặp rắc rối vì hành vi này quá thường xuyên, nhưng vẫn còn, một sự khác biệt lớn về hành vi giữa ba trình duyệt lớn là thú vị. –
Cảnh báo người dùng về dữ liệu chưa được lưu là cách sử dụng hoàn toàn hợp lệ cho 'alert' và/hoặc' confirm'. Tuy nhiên, tại sao bạn lại muốn chờ một chút trước khi cảnh báo 'alert' xuất hiện? – soktinpk