6

ユーザーがブラウザウィンドウを閉じたときにサーバーに通知したい。

私はすべてを試しました

$(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 では、ウィンドウを閉じたときだけ通知はありませんが、ページの更新時に通知があります。Chrome にはどちらもありません。

このスクリプトを Firebug または Chrome Developer Tools でトレースしようとしたところ、トレースすると機能し始めていることがわかりました。そのため、ウィンドウを閉じたりナビゲートしたりする前にリクエストを送信する時間がないため、正常に動作しないと思います。

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

解決

これはうまくいきました:

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

5 に答える 5

5

ブラウザーは応答が来るまで待たず、ajax 要求が中止される可能性があるため、非常に注意が必要です。

beforeunload イベントでこのようなことを試すことができます。

$(window).bind("beforeunload", function() {
    $.ajax({
        async: false,//This will make sure the browser waits until request completes
        url: "${contextPath}/notify?direction=logout"
    });
});
于 2012-02-10T22:22:58.733 に答える
1

これが可能だったとしても、私はまだそれをお勧めしません。これが機能するようになったとしても、すべてのブラウザーで機能するとは限りません。

ユーザーがいつドメインを離れたか知りたい場合は、フォールバックでポーリングまたは Websocket を使用してください。

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

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

于 2012-02-10T22:45:22.080 に答える
0

私はずっと前にこのシナリオに取り組んでいたので、これをコメントとして言いたくありません。エンドユーザーが誤ってまたは意図的にブラウザを閉じた場合、すべての情報をサーバーに保存します。私はあなたに言うでしょう..それはうまくいきました。、

私は素晴らしい仕事をしていると言いましたか?それはFirefoxとIEだけでした。他の多くのブラウザ(Opera、Safariなど)では失敗しました。

したがって、これらの関数はブラウザ固有のものであるため、これらの関数に依存しないことをお勧めします。

于 2012-02-10T22:25:20.413 に答える
0

ページのアンロード時に実行された JavaScript がブロックされている場合、ユーザーがページを終了することは不可能です。

すべてのスパムを想像してみてください。

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

ありがとう

于 2012-02-10T22:21:23.077 に答える