2012-02-10 21 views
1

ユーザーがブラウザウィンドウを閉じるとサーバーに通知したいと思います。ウィンドウアンロードでリクエストを送信する時間がありません

私はそれは、それがおそらくマニュアルに言われていることを、事実にもかかわらず、うまく

$(window).bind("beforeunload", function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.ajax({ 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 

どちらも仕事のすべてを試してみましたすべきだ。

Firefoxでは、私はウィンドウのクローズ時にのみ通知を受けませんが、ページをリフレッシュすると通知はありません。クロムで私はどちらも持っていない。

私はFirebugまたはChrome Developer Toolsでこのスクリプトをトレースしようとしましたが、トレースされていれば動作するようになっています!だから私はそれが正常に動作しないと思うので、ウィンドウが閉じられたりナビゲートされる前にリクエストを送信する時間がありません。

これは本当ですか?私の仕事を達成するには?

ソリューションは、これが働いた:JavaScriptをブロックしたページのアンロードで実行した場合、ユーザーがページを終了するため

$(window).bind("beforeunload", 
    function() { 
     $.ajax({ 
      async: false, 
      url: 'notify' 
     }); 
    } 
); 
+0

最初の考え:AJAXは仕事の間違ったツールです。 SJAX(同期)を使用する必要があります.AJAXは定義上、GUIスレッドを解放して処理を続行します(この場合はアンロード)。 – Shad

+0

この答えをチェックしてください:http://stackoverflow.com/a/9234785/252780 –

答えて

3

応答は、AJAXリクエストが中止される可能性がありますので、来て刚性ブラウザは待つことはありませんので、それは非常にトリッキーです。

beforeunloadイベントでこれを試すことができます。

$(window).bind("beforeunload", function() { 
    $.ajax({ 
     async: false,//This will make sure the browser waits until request completes 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 
+0

それは信頼できませんし、それを "試す"ことができ、それが動作するかもしれませんが、実稼働環境で使用するべきではありません。 –

0

あなたは運の出ているが、それは不可能だろう。

すべての迷惑メールを想像してみてください。

一部のブラウザでは、アンロードイベントが発生しますが、スクリプトとページのクリーンアップの間に競合状態が発生します。

おかげ

0

私はこの シナリオ長い時間バックに取り組んでいた、ので、私はコメントとしてこれを言う必要はありません。エンドユーザが誤ってまたは意図的にブラウザを閉じると、すべての情報をサーバに保存します。 私は を教えてくれるでしょう。それはすごくうまくいきました。、

私は素晴らしい権利を言ったのですか?まあ、それはFirefoxとIEだけでした。多くの他のブラウザ(Opera、Safariなど)では、 が失敗しました。

だから私の親切なアドバイスは、ブラウザ固有の であるため、これらの機能に依存しないようにしてください。

1

でもこれはお勧めできません。 あなたがこの作業を行うことができれば、それはすべてのブラウザでうまく動作せず、私はそれについて完全に助言します。

ユーザーがドメインを離れたことを知りたいのであれば、フォールバック付きのポーリングまたはウェブソケットを使用してください。

また、クッキーに短いタイムアウトと使用間隔を与えて、サイト上で定期的に更新することもできます。そのような仕掛けも機能します。

また、次のページのロードが開始される前にイベントが発生するため、トレース中に「開始」します。それはしばらくしていますが、前回はこれらのイベントで遊んでいましたが、次のページが読み込まれている間に一定の時間コードを実行するブラウザもあります。

+0

あなたのようなバックアップソリューションがあるので、100%の信頼性は私の仕事では問題ありません。定期的なポーリングの問題は、速く働かないということです。だから私はいくつかのブラウザで動作する高速なソリューションが必要です。 – Dims

関連する問題