Có, đó là hành vi của IE đã biết. Khi bạn cố gắng điều hướng từ JavaScript (sử dụng vị trí, location.href, location.replace, document.location, history, thậm chí cả các phương thức bùng binh như link.click hoặc form.submit), việc hủy beforeunload
sẽ làm tăng ngoại lệ. Trường hợp kiểm tra đơn giản như:
window.onbeforeunload= function() { return '?'; }
location.href= 'http://www.example.com/';
Điều này thậm chí có thể có chủ ý, để cho tập lệnh biết nỗ lực điều hướng không thành công, ngoại trừ tên lỗi hoàn toàn vô dụng. (Tôi nhận được “lỗi không xác định”.)
Các giải pháp truyền thống chỉ là để bắt nó:
try {
location.href= '...';
} catch(e) {}
Tôi luôn nghi ngờ rằng mặc dù như bắt tất cả ngoại lệ thường là tin xấu (nhưng IE không cho phép bạn chỉ bắt được ngoại lệ này ... ngắn của việc kiểm tra chính xác stringTo, điều này cực kỳ mong manh,
Một cách tiếp cận khác là chuyển onbeforeunload thành mã gọi để cho onbeforeunload thực sự không bao giờ xảy ra và không có ngoại lệ:
function navigate(url) {
if (window.onbeforeunload) {
if (confirm(window.onbeforeunload()+' Press OK to continue, or Cancel to stay on the current page.')
window.onbeforeunload= '';
else
return;
}
location.href= url;
}
Tuy nhiên, giải pháp có thể vượt quá tầm nhìn của bạn nếu, có vẻ như là bất kỳ khung công tác nào bạn đang sử dụng đang chèn mã, thay vì đó là thứ bạn đã tự viết.
onclick="location.href='/<WhicheverPageYouRequested>.aspx'";
loại điều khiển này là gì? Dường như đáng ngờ trong chính nó là trung thực: chắc chắn một cái gì đó bạn bấm vào để đi đến một trang khác sẽ được đánh dấu là một liên kết đơn giản, và không phải là một yếu tố JavaScript-onclick (những điều này đi sai theo nhiều cách). Nếu đó là một liên kết không phải JavaScript đơn giản, bạn sẽ không phải lo lắng về lỗi IE.
Ngẫu nhiên, chức năng tải trước của bạn có thể sẽ không thành công trên các trình duyệt không phải IE (returnValue là một điều chỉ có trong IE). Nó cũng có vẻ hơi quá phức tạp ... có vấn đề gì với:
window.onbeforeunload= function() {
if(checkIsDirty())
return 'If you continue your changes will not be saved.';
}