32

これの実際の使用例はありませんが、window.onbeforeunload がトリガーされたときにユーザーが「このページにとどまる」をクリックした場合に反応する方法 (コールバック) があるかどうか、興味があります。

http://jsfiddle.net/rWHU9/

function warning(){
    if(true){
      console.log('leaving');
      return "You are leaving the page";
    }
}
window.onbeforeunload = warning;​
4

5 に答える 5

27

ページにとどまるためのコールバックはありませんが、ページを離れるためのコールバックがありますwindow.unload

でタイムアウトを設定してbeforeunloadから、アンロードでクリアしてみてください。残っている場合はタイムアウトが実行され、そうでない場合はクリアされます。

var timeout;

function warning() {
    timeout = setTimeout(function() {
        alert('You stayed');
    }, 1000);
    return "You are leaving the page";
}

function noTimeout() {
    clearTimeout(timeout);
}

window.onbeforeunload = warning;
window.unload = noTimeout;​

デモ: http://jsfiddle.net/aPwfz/1/

于 2012-08-06T20:24:14.823 に答える
10

簡単な答え:いいえ、「このページにとどまる」イベントを傍受するためのコールバックや直接的な方法はまだありません。

ただし、少しごまかして、次のような構成を作成することができます。

function warning() {
    setTimeout(function() {
        setTimeout(function() {
            alert('user choosed to stay on this site: ' + location.href);
        }, 100);
    },1);
    return "You are leaving the page";
}
window.onbeforeunload = warning;​

質問はモーダルダイアログであるため、setTimeoutモーダルボックスを確認するまでコールバックは発生しません。しかし、あなたが今正しく想定しているように、これは「このサイトを離れる」をクリックした場合にもトリガーされます。したがって、これは注意が必要です。setTimeoutこれを解決するには、ブラウザにページを表示するのに十分な時間を与えるためにを増やす必要がありunloadます。

なぜ2つsetTimeout()のがネストされているのですか?まあ、モーダルダイアログがポップアップするとすぐにタイマーが「実行」されます。したがって、モーダルダイアログが閉じられるまでそのタイマーを実行したくありません。それが起こるとすぐに、私たちのインナーsetTimeoutは起動し、時間の経過とともに何かをします。

2.000ほとんどの現実世界のシナリオの現実的な値は、内部の約ミリ秒だと思いますsetTimeout

于 2012-08-06T20:21:43.077 に答える
5

ユーザーがキャンセルをクリックしたことを確認する唯一の方法は、 をトリガーして、それが起動するsetTimeoutかどうかを確認することです。システムのconfirmesque ボックスからの戻り値を調べる方法はありません。

http://jsfiddle.net/rWHU9/2/

于 2012-08-06T20:20:25.277 に答える
1

「ここで質問」を返す前に、他の関数を呼び出す最初のコードとして setTimeout をトリガーしてみてください (たとえば 5 ~ 10 秒)。すなわち

window.onbeforeunload = confirmExit;
function confirmExit() {
    setTimeout("thisFunction;", 10000);
    return "do you realy want to close?";
}

onbeforeclose をキャンセルするには、これでうまくいきました: 空の関数を試してください:

window.onbeforeunload = function(){};

ありがとう、頑張って!

于 2014-07-13T05:23:02.157 に答える