6

我正在创建一个安装了 beforeunload 处理程序的弹出窗口。当使用“Close”文件菜单项关闭弹窗时,调用了两次 beforeunload 处理程序,产生了两个“Are you sure you want to close this window?”。出现的消息。

这是 Firefox 的一个错误,我已经在此处报告了它,但我仍然想要一种方法来防止这种情况发生。您能想出一种明智的方法来检测双重 beforeunload 以防止双重消息问题吗?问题是 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

在处理程序中设置一个变量以防止对话框第二次出现。之后使用 setTimeout 重置它。

于 2009-11-26T06:07:46.757 回答
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

我在 Chrome 21、Firefox 14、IE 7-9、Safari 5(在 PC 上)中发现了这个问题。

以下适用于所有这些浏览器。如果在事件期间删​​除了 window.onbeforeunload 函数,这将阻止第二次调用。诀窍是如果用户决定留在页面上,则重置 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 卸载事件中

$(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 回答
-1

我有一个文档用 window.open 打开另一个弹出窗口。在原始窗口中,我已经注册(使用 jquery)“卸载”事件的侦听器,如下所示:

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

我遇到了这个页面,因为该事件有效地触发了两次。我发现它不是一个错误,它会触发两次,因为它会触发一次“about:blank”页面被您的页面替换,另一个触发您的页面被卸载。

我所要做的就是通过查询原始事件来过滤我感兴趣的事件:

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

我不知道这是否适用于原始问题,因为它是一个窗口打开另一个窗口的特殊情况,但我希望它有所帮助。

于 2016-07-11T07:20:42.427 回答