6

beforeunload ハンドラがインストールされたポップアップ ウィンドウを作成しています。「閉じる」ファイル メニュー項目を使用してポップアップを閉じると、beforeunload ハンドラが 2 回呼び出され、「このウィンドウを閉じてもよろしいですか?」という 2 つのメッセージが表示されます。メッセージが表示されます。

これは Firefox のバグであり、ここで報告しましたが、これが起こらないようにする方法が必要です。二重メッセージの問題を防ぐために、二重の beforeunload を検出する適切な方法を考えられますか? 問題は、ユーザーがダイアログのどのボタンをクリックすることを選択したか ([OK] または [キャンセル]) を Firefox が教えてくれないことです。

4

9 に答える 9

2
<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>
于 2010-06-30T07:06:41.820 に答える
1

これは間違いなくFFのバグです。https://bugzilla.mozilla.org/show_bug.cgi?id=531199で報告しました

于 2010-02-19T09:23:47.593 に答える
1

私が見つけた最善の解決策は、500ミリ秒など、非常に多くのミリ秒後にリセットされるフラググローバル変数を使用することです(これにより、関数を再度呼び出すことができますが、出現直後ではありません)。

次の最後のコードを参照してください。

http://social.msdn.microsoft.com/Forums/en/sharepointinfopath/thread/13000cd8-5c50-4260-a0d2-bc404764966d

于 2010-04-07T16:59:44.807 に答える
1

ハンドラに変数を設定して、ダイアログが 2 回目に表示されないようにします。後で setTimeout を使用してリセットします。

于 2009-11-26T06:07:46.757 に答える
1

この問題は、Chrome 21、Firefox 14、IE 7-9、Safari 5 (PC) で見つかりました。

以下は、これらすべてのブラウザで機能します。イベント中に window.onbeforeunload 関数を削除すると、2 回目の呼び出しが防止されます。秘訣は、ユーザーがページにとどまることにした場合に window.onbeforeunload 関数をリセットすることです。

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();
于 2012-08-18T20:19:29.863 に答える
0

ハンドラー内でtrueに設定されるグローバル変数を作成します。この変数がfalseの場合にのみ、アラート/ポップアップを表示します。

于 2009-11-26T01:40:00.010 に答える
0

次のスニペットを使用して、出口数を追跡します

ページが読み込まれると、次の変数exitCountが初期化されます

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

およびウィンドウアンロードイベント

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});
于 2011-05-22T18:07:04.687 に答える
0

confirm() を独自に呼び出す代わりに、even.preventDefault(); を実行するだけであることがわかりました。beforeunload イベント内。Firefox は独自の確認ダイアログを表示します。これが正しい/標準的なことかどうかはわかりませんが、それが彼らのやり方です。

于 2011-11-23T03:11:45.540 に答える