2013-02-18 55 views
8

So supposedly starting at Firefox > 4,綁定窗口jQuery對象beforeunload不再工作。將AJAX發送到服務器之前undeunload

我想要做的是提交一個AJAX帖子來刪除我的服務器的memcache數據。

當我刷新只打開的選項卡,我可以看到beforeunload事件被稱爲在Firefox和用下面的代碼由鍍鉻的消息的console.log,「火狐/ NON-火狐刪除」就是明證。問題是,我從來沒有看到console.log消息「memcache delete」,表明我的服務器從未看到$.ajax請求。

我意識到做瀏覽器嗅探並且if和else語句中包含的內容沒有區別。我只是展示了我在Firefox中嘗試失敗的代碼。

任何人有任何想法?

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
}); 

function memcacheDelete() { 
    $.ajax({ 
     url: "/memcache/delete", 
     type: "post", 
     data:{}, 
     success:function(){ 
      console.log('memcache deleted'); 
     }//success 
    }); //ajax 
} 

回答

11

Ajax是異步的。

刷新(或關閉)瀏覽器時,正在調用beforeunload。這意味着只要beforeunload完成執行,頁面將刷新(或關閉)。

當你做一個ajax請求時(由於它的異步),javascript解釋器不會等待要執行的ajax success事件並向下移動完成beforeunload的執行。

success ajax應該在幾秒鐘後調用,但是由於頁面已被刷新/關閉,所以你不會看到它。

旁註:

.success()方法已過時,並且由.done()方法代替

Reference

+0

是...我明白了非同步調用此路是我想... + 1 – cliffbarnes 2013-02-18 05:27:31

+1

@Jashwant,爲explanation.Though感謝,我有證據表明,在關閉/重新打開瀏覽器後使用Chrome時,memcache刪除成功,但它仍然是**不是用firefox刪除。這裏似乎還有其他的東西......將'$ .ajax'轉換爲同步,'async:false',有幫助嗎? – 2013-02-18 05:33:47

+4

它看起來像將[$ .ajax'選項'async'更改爲'false'](http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings)可以糾正問題。有沒有什麼理由不想這樣做? – 2013-02-18 05:41:24

7

剛剛完成的緣故,這裏是我做什麼,感謝@Jashwant爲指導: 我注意到,this other SO Q&A suggested the same solution關鍵是async:true(false)$.ajax電話:

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    var data={async:false}; 
    memcacheDelete(data); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    var data={async:true}; 
    memcacheDelete(data); 
    return null; 
    } 
}); 

function memcacheDelete(data) { 
    $.ajax({ 
    url: "/memcache/delete", 
    type: "post", 
    data:{}, 
    async:data.async, 
    success:function(){ 
     console.log('memcache deleted'); 
    }//success 
    }); //ajax 
} 
+1

只是爲了滿足我的好奇心。在Firefox檢測例程(if)中,&&新數字(RegExp。$ 1)> = 4'的含義是什麼(使用)?只要保證,Firefox的版本是4或更新? – trejder 2013-07-02 11:24:47

+0

是的,我會這樣認爲的 – 2013-07-02 12:12:22