2012-01-03 133 views
1

我想在用戶離開頁面或關閉窗口時發送ajax請求。
這裏是我的代碼中:'onbeforeunload'兩次觸發

<script type="text/javascript"> 
    function sendajax(){ 
     $.ajax({ 
      url: "someurl", 
      data: mydata, 
      async : false 
     }); 
    } 
</script> 
    <script type="text/javascript"> 
    window.onbeforeunload=function(){sendajax();}; 
</script> 

當事件發生時,事件觸發兩次。
爲什麼會發生?
我知道我可以通過添加一個變量var ajaxSent=true;來防止它,但可能有更乾淨的方法來做到這一點?

UPD:
我更換了sendajax功能內容與一些其他的代碼(不發送Ajax),並發現AJAX是不是一個導致了問題。它仍然進入該功能兩次。

+0

頁面上是否有iframe? – beeglebug 2012-01-03 11:22:03

+0

不,這是僅包含一些文本和鏈接的測試頁面的一部分 – lvil 2012-01-03 11:27:45

+0

您能舉一個例子嗎?另外,你看到了什麼瀏覽器發生這種情況? – beeglebug 2012-01-04 08:30:59

回答

5

基礎,它看起來可能只是由於您點擊離開頁面而斷開的鏈接而造成的。

考慮下面的代碼:

<script> 
    function doSomething() { console.log('onbeforeunload fired'); } 
    window.onbeforeunload = doSomething; 
</script> 
<a href="garbage">link A</a> 
<a href="http://google.com">link B</a> 

如果我點擊的鏈接A,我得到兩個控制檯日誌條目,如果我點擊鏈接B I只有一次。

看起來它可能是一個瀏覽器如何處理他們的內部「這個網頁還沒找到」的頁面,導致你的頁面在顯示消息之前被刷新並關閉,讓你出現兩次onbeforeunload事件。

+0

時,你必須將一個事件參數傳遞給sendajax函數。 – lvil 2012-01-04 07:50:32

+0

根據IE文檔模式的不同,我發現beforeunload事件的行爲差異很大(尤其是調用次數)。更新的和更標準的行爲觸發的頻率低於舊的向後兼容(IE10)兼容性行爲。 – BlueMonkMN 2017-07-12 14:16:42

0

你可以試試下面的代碼:

<script type="text/javascript"><br> 
    window.onbeforeunload=function sendajax(){<br> 
     $.ajax({<br> 
      url: "someurl",<br> 
      data: mydata,<br> 
      async : false<br> 
     });<br> 
};<br> 
</script> 

,或者你可以在一些地方定義sendajax() {}和使用它就像在你的編輯和註釋代碼onbeforeunload = "sendajax()"不是onbeforeunload = "function() { sendajax() }"

+0

命名內聯函數的目的是什麼?之後你不能引用sendajax,這似乎是多餘的。 – beeglebug 2012-01-03 11:39:31

+0

@beeglebug:你說得對,當你只想使用一次函數時就是這種情況。 如果你想使用該函數,你可以在其他地方定義它,並應該調用像onbeforeload =「sendajax()」 不像onbeforeload =「function(){sendajax()}」 ,因爲這裏的sendajax被調用定義函數時首先兩次(注意不是sendajax()外部函數),並且在定義外部函數本身後會被調用一次,它會再次調用sendajax()。 – 2012-01-03 11:57:54

+0

我改變了'window.onbeforeunload = function(){sendajax();};'到'窗口。onbeforeunload = 「sendajax()」;」和'window.onbeforeunload =「sendajax();」;'和'window.onbeforeunload =「sendajax」;'。以上都沒有工作。該功能沒有執行。 – lvil 2012-01-04 07:59:49