2010-10-24 110 views
2

我想告訴每當你離開頁面(不是惱人的警告,只是一些HTML告訴你等待)的消息,在考慮這個問題,我面臨一定的困難:javascript location.href onchange事件監聽器?

  • 當用戶在 瀏覽器中按下停止,取消導航離開 操作,我想消息去 了。

  • 只要有任何鏈接被點擊,就會出現該消息。

  • 當點擊鏈接只是打開另一個選項卡(忽略_blank目標)

這樣說,應該無法捕捉的,觸發事件是非常簡單的,只有像

$(document).unload(function() 
{ 
    // display message 
}); 

問題是,如果用戶取消,消息不會消失。

一個可能的解決將是:

$(window).unload(function() 
{ 
    // display message 

    setTimeout(function() 
    { 
     // hide message 
    },5000); 
}); 

,但我想知道是否有一個更清潔的方式,只是當用戶取消了導航(或失敗任何其他原因),我可以隱藏消息。

編輯#2:

我只注意到與上面的代碼,在FF沒有顯示消息,直到頁面留在如果用戶按下停止這一點,他將收到有關:空白。如果他在此之前按下「停止」,則不會顯示該消息。這正是我想要的。

在Internet Explorer中,消息從不顯示,我假設這是因爲IE處理的東西不同。我想知道在Chrome中會發生什麼?

回答

1

這是一個適用於所有瀏覽器的解決方案。它使用document.readyState屬性,該屬性適用於除早期版本FireFox(適用於版本3.6.8)以外的所有瀏覽器。如果瀏覽器支持readyState屬性,它將檢查readyState是否加載(瀏覽器正在到另一個頁面)或完成(或其他指示頁面不在任何地方)。如果瀏覽器不支持readyState,則默認爲您的解決方案。

(function(){ 
    var hideMessage=document.readyState?function(){ 
     setTimeout(function(){ 
      if(document.readyState=='loading'){ 
       hideMessage(); 
      }else{ 
       //hide message 
      } 
     },500); 
    }:function(){ 
     // hide message 
    } 
    function displayMessage(){ 
     // display message 
    } 
    window.onbeforeunload=function(){ 
     displayMessage(); 
     setTimeout(hideMessage,document.readyState?10:5000); 
    }; 
}()); 
+0

嗯...我喜歡這個,儘管IE並沒有顯示這個消息。我猜$(窗口).unload函數永遠不會在IE中觸發? – bevacqua 2010-10-24 21:16:06

+0

$(window).unload會觸發,如果你有jQuery也加載和頁面實際上卸載,因爲在另一個頁面正在加載通過此頁面。我從問題中複製$(window).unload,這是使用錯誤的事件。我已經改變了上面的代碼,它現在應該工作。 – Eric 2010-10-25 05:01:24

2

至於第一點:

當用戶在瀏覽器中按下停止,取消了導航外賣行動

,我想消息走開。

我已經有the same question了,而且我的後續研究也支持這個響亮的迴應 - 這是不可能的。一旦你開始一個新頁面的請求,就不可能以編程方式可靠地「回來」。暫停可能確實是唯一的出路。

但是,其他兩點應該相對簡單:遍歷每個鏈接(例如,使用jQuery),並添加一個打開確認窗口的事件click,並返回false,以便不打開原始href。這也應該是比較容易的,僅限於內部鏈接做(檢查是否有target屬性,如果它是_blank,獨自離開的鏈接。)

,有可能成爲很難對付已經有click事件,雖然鏈接,和其他事件導致形式提交不同的頁面。

+0

檢查我的編輯! – bevacqua 2010-10-24 21:18:27