2013-02-18 26 views
8

So supposedly starting at Firefox > 4、ウィンドウjQueryオブジェクトをbeforeunloadにバインドしてもはや動作しません。AJAXをサーバーbeforeunloadに送信する

私のやりたいことは、サーバーのMemcacheデータを削除するAJAX投稿を送信することです。

開いている唯一のタブをリフレッシュすると、beforeunloadイベントがconsole.logメッセージ「firefox/NON-firefox delete」で示されるように、firefoxとchromeの両方で次のコードで呼び出されていることがわかります。問題は、私のサーバーが$.ajax要求を見たことがないことを示すconsole.logメッセージ "memcache delete"が表示されないことです。

ブラウザスニッフィングを行うのが悪いことと、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の実行が終了するとすぐに、ページがリフレッシュ(または閉じる)を意味します。

(非同期なので)javascriptインタプリタは、ajax successイベントが実行されるのを待たずにbeforeunloadの実行を終了します。

success ajaxは数秒後に呼び出されるはずですが、ページがリフレッシュ/クローズされても表示されません。

サイドノート:

.success()法が廃止されており、ただ、完了のために

Reference

+0

はい...私は非同期呼び出しを理解する方法は、これは私が考えたものである... + 1 – cliffbarnes

+1

@Jashwant、explanation.Thoughに感謝ブラウザを閉じた後にChromeを使用したときにMemcacheの削除が成功したという証拠がありますが、まだFirefoxでは**削除されていません。ここに何か他のものがあるようです。 '$ .ajax'を同期、async:false'に変換する必要がありますか? –

+4

['$ .ajax'オプション' async'を 'false'に変更しました](http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings)問題を修正します。誰かがそれをしたくない理由がありますか? –

7

.done()方法によって置き換えられ、ここで@Jashwantのおかげで、私がやったことです指導のため: 私は気づいたthis other SO Q&A suggested the same solutionKEYが以下$.ajaxコールでasync:true(false)次のとおりです。

$(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)の '&& new Number(RegExp。$ 1)> = 4'の意味(使用)は何ですか? Firefoxがバージョン4以降になっていることを確認するだけです。 – trejder

+0

はい私はそう思います –

関連する問題