4

ユーザーが自分のアプリをどれだけ簡単に離れられるかを制御したい。今、私はそれを完全に行うことができないことを知っています。それがcronジョブの目的です。しかし、できるだけ多くのケースをキャッチしたいと思います。

onBeforeUnloadダイアログ ボックスを表示して、終了することを警告し、代わりに [終了] ボタンをクリックするように求めることができると思いました。

しかし、その後、 が呼び出されたときに同期 AJAX (heh) 呼び出しを実行できる可能性があることがわかりましたonBeforeUnload。私が理解しているように、同期であることの利点は、ブラウザが続行する前に終了するのを待つことです。そうすれば、サーバーがウィンドウを閉じるときにログオフしていることをサーバーに伝えることができます。in でonBeforeUnloadあり notであるためonUnload、すべてのデータがまだ残っており、呼び出しが送信されます。

私の質問は、これらを組み合わせることは可能ですか? 離職を警告するポップアップを表示して、引き続き離職を希望する場合は、実際に離職する旨のメッセージを送信してください。

私の理解では、これはできません。できます:

  1. メッセージのみを送信する
  2. ダイアログのみを表示する
  3. メッセージを送信してダイアログを表示する

...しかし、彼らがダイアログを受け入れた場合、条件付きでメッセージを送信することはできませんよね? 私の理解では、彼らが「OK, I want to leave」をクリックするとすぐに発火onUnloadし、その時点では手遅れです。上記の #3 は役に立ちません。ユーザーがログオフしているというメッセージを送信してから、ダイアログをキャンセルしてページにとどまらせたくないからです。

私のケーキを持って食べてもいいですか?彼らが去りたいかどうか尋ねて、そうであれば、メッセージを送ることはできますか?

4

1 に答える 1

-1

コメントで既に述べたようにonbeforeunload、Opera では機能しません。ただし、Firefox (3.6.3/Linux) と Chromium (5.0.375.70) で次のコードを試してみたところ、多かれ少なかれ機能しました。ただし、Chromium のウィンドウまたはタブを閉じると、確認ボックスが表示されますが、 をクリックしても 1 秒以内にウィンドウまたはタブが閉じられますOk。中に同期 XMLHttpRequests のタイムアウトがあるようonbeforeunloadです。

window.onbeforeunload = function () {
    if (confirm("Send unsaved data?"))
        sendData();

};

function sendData() {
    var request = new XMLHttpRequest();
    request.open("POST", "wait.php", false); // false = synchronous request
    request.send('data={"foo":"bar"}');
    if (request.readyState == 4 && request.status == 200)
        alert("Succes!");

}

更新– を含めるのを忘れたので、完全を期すためにwait.php、接続を 10 秒間保持するだけです。

<?php sleep(10); ?>
于 2010-06-25T21:37:33.653 に答える