Firefoxでwindow.onbeforeunloadが2回呼び出されました-これを回避する方法は?

StackOverflow https://stackoverflow.com/questions/1800974

質問

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

これはFirefoxのバグです。ここで報告しました、しかし、私はまだこれが起こらないようにする方法が欲しいです。ダブルメッセージの問題を防ぐために、ダブルアンロード前を検出する適切な方法を考えることができますか?問題は、ユーザーがクリックすることを選択したダイアログ内のボタン-[OK]または[キャンセル]がFirefoxに表示されないことです。

役に立ちましたか?

他のヒント

<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>

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

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

最後のコードを見る:

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

この問題は、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();

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

次のスニペットを使用してexitcountを追跡します

ページがロードされると、次の変数exitCountが初期化されます

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

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

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


            if (MTG.exitCount<=0) 
            {

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




});

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

window.openで別のポップアップウィンドウを開くドキュメントがあります。元のウィンドウで、(jqueryを使用して)「アンロード」のリスナーを登録しました。このようなイベント:

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

イベントが事実上2回トリガーされたため、このページに出会いました。私が見つけたのは、それがバグではなく、「about:blank」について1回起動するために2回トリガーされることですページと、アンロードされるページの別のページに置き換えられるページ。

私がしなければならないのは、元のイベントをクエリすることで、興味のあるイベントをフィルタリングすることです:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

ウィンドウが別のウィンドウを開く特殊なケースであるため、これが元の質問に当てはまるかどうかはわかりませんが、役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top