2009-10-02 29 views
5

tôi nắm bắt được sự kiện window.onbeforeunload sử dụng đoạn mã sau:"Unknown ngoại lệ" khi hủy trang dỡ bỏ với "location.href"

window.onbeforeunload = function (evt) 
{ 

    if(checkIsDirty()) 
     { 
      var message = 'If you continue your changes will not be saved.'; 
      if (typeof evt == 'undefined') 
      { 
       //IE 
       evt = window.event; 
      } 
      if (evt) 
      { 
       evt.returnValue = message; 
      } 
      else 
      { 
       return message; 
      } 
     } 

} 

Khi tôi nhấp vào 'Hủy' trong thư xác nhận kết quả, tôi nhận lỗi "Ngoại lệ không xác định" và thông tin sau được đánh dấu bởi trình gỡ lỗi:

onclick="location.href='/<WhicheverPageYouRequested>.aspx'; 

Nếu tôi nhấp OK, trang thay đổi hoàn hảo. Tại sao tôi nhận được lỗi này và làm cách nào để khắc phục lỗi này?

Trả lời

9

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.'; 
}