3

ユーザーがページを離れるときに実行する必要のある非同期機能(ソケットを閉じる)があります。私はjQueryを介してそれをやろうとしました:

$(window).unload(function() {
   socket.disconnect();
});

ただし、関数が非同期であり、クライアントがメソッドの最後に到達するとすぐに、つまり即座にページを離れ、ソケットを切断する要求が実行されないため、これは機能しません。

socket.disconnect()関数の実行の最後に実行されるコールバックを提供できます。多分これは役立つかもしれません...

これを解決する方法はjavascriptにありますか?

4

5 に答える 5

3

私は首を突き出して、これが実行可能であるとは思わないと言います-少なくともクロスブラウザではありません。

提案されたように、経由でナビゲーションを中断することはできますがonbeforeunload、これは同じクロスブラウザーで実装されていません。また、中断できたとしても、ユーザーがどこに向かっていたかをキャプチャすることはできません(私は信じています)。コールバック、あなたはそれらを転送することができます。

理想的な妥協案はonbeforeunload、少なくともサーバーから手動で切断するように促すために使用することです。多くの人がそうするでしょう。そうでないものは、サーバー側の検出で検出できます。

于 2012-07-31T09:11:58.513 に答える
1
window.onbeforeunload = function () {
    socket.disconnect();
    return 'This will disconnect all connections'; //Throws a prompt to user
};

更新:これが機能しないことは見ていませんでした。

これを強制的に同期させる方法はありますか?

おそらく..

var complete = false;

socket.on('disconnect', function () {
    complete = true;
});

while(!complete){
    //do nothing
}

私の場合はそうです。

$.ajax({
    async: false    
});

これはで正常に動作しonbeforeunloadます。

于 2012-07-31T09:08:20.477 に答える
0

たぶん、そこのように「unload」の代わりに「beforeunload」イベントを使用してみることができますが、別の方法でウィンドウを閉じるのを遅らせる方法はないと思います。

于 2012-07-31T09:04:58.440 に答える
0

socket.io 0.9.4にダウングレードしたため、ローカルバージョンで動作するようになりました。確かにバグでした。これで、バージョン0.9.4のホスト(Heroku)でも動作しなくなりました(構成しました)。

これを解決するために何をすべきかわかりませんが、少なくともローカルでは機能します...

于 2012-07-31T12:37:57.963 に答える
0

私が持っていた同様の質問を見てください、それはsocket.ioから0.9.5にバグがあったことがわかりました0.9.9

これが私の質問へのリンクです。お役に立てれば。

于 2012-08-28T02:20:01.753 に答える