2

次の Jquery 関数を使用して、保存されていない変更があり (SO と同様)、現在の画面を離れようとしているときにプロンプ​​トを表示してユーザーに通知します。

<!-- in my aspx page -->
<script type="text/javascript" language="javascript">
    window.onbeforeunload = function()
    {
        if (HasPendingUpdates())
        {
            return "Changes you have made will not be saved.";
        }
    }
</script>

これは期待どおりに機能し、ユーザーが href をクリックしてブラウズしたり、戻るボタンなどを使用しようとすると、メッセージ ボックスが表示されますasp:LinkButton。ページを離れる前に。ユーザーがこれをクリックするLinkButtonと、プロンプトが 2 回表示されます。

シナリオ:

  1. ユーザーがLinkButton
  2. プロンプトが表示され、ユーザーはキャンセル ボタンをクリックします。
  3. プロンプトが消え、ユーザーはまだ画面上にいます。良い。

  4. ユーザーがLinkButton

  5. プロンプトが表示され、[OK] ボタンをクリックします。
  6. プロンプトが消え、同じプロンプトが再び表示されます。
  7. ユーザーはもう一度 [OK] をクリックします。
  8. プロンプトが消え、ユーザーが次の画面に移動すると、すべて問題ありません。

では、なぜ 2 番目のプロンプトが表示されるのでしょうか??? OnBeforeUnload はどのように 2 回起動しますか?

4

3 に答える 3

0

jQueryでハンドラーを追加すると、それらがスタックされます。hrefsにjQuery関数を使用してハンドラーを割り当ててから、リンクボタンに再度割り当てる場合は、2つのハンドラーが配置されます。

onunloadハンドラーをバインドする頻度を確認し、前のハンドラーのバインドを解除するか、1回だけ実行するようにします。

于 2010-02-10T18:59:59.480 に答える
0

これを修正する方法は次のとおりです。

    var checkChangesEnabled = true;
    window.onbeforeunload = confirmExit;

    function confirmExit() {
        if (checkChangesEnabled) {
            event.returnValue = "Changes you have made will not be saved.";
            disableCheck();
        }
    }

    function disableCheck() {
        checkChangesEnabled = false;
        setTimeout("enableCheck()", "100");
    }

    function enableCheck() {
        checkChangesEnabled = true;
    } 
于 2012-06-07T18:50:06.627 に答える