2009-10-02 44 views
5

我用下面的代碼捕獲window.onbeforeunload活動頁面卸載時:「未知異常」取消與「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; 
      } 
     } 

} 

當我出現的確認點擊「取消」,我得到錯誤「未知異常」,調試器突出顯示以下內容:

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

如果單擊確定,頁面會完全更改。爲什麼我得到這個錯誤,我該如何解決它?

回答

9

是的,這是一種已知的IE行爲。當您嘗試從JavaScript導航(使用位置,location.href,location.replace,document.location,歷史記錄,甚至是link.click或form.submit等迂迴方法)時,beforeunload Cancel將引發異常。測試用例是簡單:

window.onbeforeunload= function() { return '?'; } 
location.href= 'http://www.example.com/'; 

這甚至可能是故意的,讓腳本知道導航嘗試失敗,只是錯誤的名字是如此完全無用。 (我得到「未指定錯誤」。)

傳統的解決方案是正好趕上它:

try { 
    location.href= '...'; 
} catch(e) {} 

我總是懷疑,雖然作爲追趕所有異常通常是一個壞消息(但IE不允許你只捕獲這個異常...檢查確切的stringTo,這是非常脆弱的。

另一種方法是將onbeforeunload工作移動到調用代碼,以便真正的onbeforeunload永遠不會發生和沒有例外:

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

然而,無論哪種解決方案都可能超出您的把握,如果看起來很可能它是您正在使用的插入代碼的任何框架,而不是您自己寫的東西。

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

這是什麼樣的控制?老實說,看起來可疑的是:你點擊到另一個頁面的東西應該被標記爲一個簡單的鏈接,而不是JavaScript-onclick元素(這些元素在很多方面都會出錯)。如果它是一個簡單的非JavaScript鏈接,則不必擔心IE錯誤。

順便說一句,您的beforeunload函數可能會在非IE瀏覽器上失敗(returnValue是一個IE瀏覽器)。它也似乎有點過於複雜...怎麼了:

window.onbeforeunload= function() { 
    if(checkIsDirty()) 
     return 'If you continue your changes will not be saved.'; 
} 
相關問題