2013-10-09 38 views
5

私のアプリケーションでは、ユーザーが別のページに切り替えるか、ブラウザを閉じる前に、サーバーに戻す必要があるオブジェクトがあります。window.unloadでajaxを呼び出す

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

はすべてのブラウザでAJAX呼び出しを起動しますか、これは動作しません状況があると、この状況は異なる方法で処理する必要があります瞬間のために

、私はこのようなものを使用していますか?私は成功関数の点で何も処理する必要はありません、私はサーバーにそれを作る情報を心配しています。

ありがとうございました。

+1

ページがなくなる前に「アンロード」イベントが生成されているとは限りません。 *通常の状況ではブラウザーで実行されますが、ブラウザーが何もできなくなった場合(突然のシステムシャットダウンなど)ではできません。 – Pointy

+0

あなたはそのlogiによって何かに頼ることはできません... *電源コードを引く* –

答えて

3

jQueryを使用している場合は、ajax呼び出しでasyncをfalseに設定できます。それはうまくいくかもしれませんが、ブラウザによって結果が異なる場合があります。ここにjsFiddleの例があります。 Google Chromeでhttp://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

私はページから移動する前に、AJAX呼び出しは常に完了します。

しかし、私はそのルートに行くことを非常に推奨しません。 ajaxの "a"は "非同期"のためであり、同期呼び出しのように強制しようとすると、問題を尋ねています。その問題は、通常、ブラウザをフリーズするように現れます。これは、ajax呼び出しに長時間かかる場合に起こる可能性があります。

実行可能な場合は、ページにajax経由で投稿する必要があるデータがある場合は、ページからナビゲートする前にユーザーに確認することを検討してください。たとえば、この質問を参照してください。jquery prompt to save data onbeforeunload

1

残念ながら、非同期呼び出し中にドキュメントがアンロードされるため、あなたのAjaxコールは完了しません。 ユーザーがウィンドウを閉じるときには、多くのことを行うことはできません。

0

onbeforeunloadイベントを使用して、同期AJAX呼び出しを行う必要があります。

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

代わりのAjaxの同期呼び出し(最新のブラウザで非推奨と例外を取得することができます)を実行し、あなたがポップアップを開くことができます。

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

あなたがに明らかにパラメータを追加することができますポップアップを自動的に閉じることができます。 ブラウザのオプションでドメインのポップアップブロッカーを無効にする必要があります。