web-dev-qa-db-ja.com

window.onbeforeunloadは、ページを閉じるときではなく、ページを更新するときに実行されます

window.onbeforeunloadを使用して、閉じるイベントが発生したときに確認ダイアログをポップアップ表示していますが、確認ダイアログはページの更新時に表示され、ページを閉じるときに実行されません。

JavaScriptコードは次のとおりです。

<script language="JavaScript">
    window.onbeforeunload = confirmWinClose();
    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }    
</script>

Chrome、Firefox、Internet Explorerで試してみました。

10
Java Player

あなたのコードの問題:

on refresh the page is unloaded and then reloadedであるため、関数はrefreshのときに呼び出されます。

ソリューションでは、functionwindow.onbeforeunloadに割り当てていないが、書き込み時にreturn value of the functionを割り当てていることにも注意してください。

window.onbeforeunload = confirmWinClose();

これは、割り当てが行われるたびに(JavaScriptでの配置場所に基づいて)関数を実行する場合もあります。例えば.

function confirmWinClose() {
var confirmClose = confirm('Close?');
return confirmClose;
}

window.onbeforeunload = confirmWinClose();

上記のコードは、このjsが読み込まれるたびにconfirmWinClose関数を実行します。

(呼び出し後に関数を定義したのであなたのケースではないので、ロード時に実行されませんが、これを覚えておく必要があります)

解決策:

以下の解決策はcloseでも機能しています

あなたの解決策の代わりに、私はこれを試しました

JS:

window.onbeforeunload = function() {
    var confirmClose = confirm('Close?');
    return confirmClose;
}

または

 window.onbeforeunload = confirmWinClose; //note the absence of calling parantheses

    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }

これは期待どおりに機能します。

また、returnから明示的にonbeforeunloadを取得する必要があることにも注意してください。

関数を呼び出さなければならない場合でも、

<script>
    window.onbeforeunload = function(e) {
       callSomeFunction();
       return null;
    };
</script>
6
gaurav5430

完全な解決策はありませんが、F5キーをインターセプトできます(ユーザーがブラウザの更新ボタンをクリックしてもインターセプトされません...)

var isRefresh = false;

// with jquery

$(function() {
  $(document).on("keydown", function(e) {
    if (e.which === 116)
    {
      isRefresh = true;
    }
  });
});

window.onbeforeunload = function() {
 if (! isRefresh)
 {
   return confirm ('Close ?');
 }
 return false;
};
3
Paul Rad

これを試してみてください。イベントが発生したときに実行する必要があるonloadにメソッドを割り当てているため、オブジェクトのようにする必要があります。詳細な説明についてはリンクを参照してください- var functionName = function(){} vs function functionName(){}

 window.onbeforeunload = confirmWinClose;
 function confirmWinClose () {
 var confirmClose = confirm('Close?');
 return confirmClose;
 };
0
Neha

とにかくテキストを表示したいだけなので、期待どおりにonbeforeunloadを使用すると、文字列が返されるだけですか?

<script language="JavaScript">
  window.onbeforeunload = confirmWinClose;
  function confirmWinClose() {return "close?";}
</script>
0
Daniel