Javascript Firefox中两次调用window.beforeunload-如何解决这个问题?

Javascript Firefox中两次调用window.beforeunload-如何解决这个问题?,javascript,firefox,onbeforeunload,Javascript,Firefox,Onbeforeunload,我正在创建一个安装了beforeunload处理程序的弹出窗口。使用“Close”(关闭)文件菜单项关闭弹出窗口时,将调用beforeunload处理程序两次,从而出现两条消息“确定要关闭此窗口吗?” 这是Firefox的一个bug,我已经解决了,但我仍然希望有一种方法来防止这种情况发生。您能想出一种明智的方法在卸载前检测双重消息以防止双重消息问题吗?问题是Firefox没有告诉我用户选择单击对话框中的哪个按钮-确定或取消。在处理程序中创建一个设置为true的全局变量。仅当此变量为false时显

我正在创建一个安装了beforeunload处理程序的弹出窗口。使用“Close”(关闭)文件菜单项关闭弹出窗口时,将调用beforeunload处理程序两次,从而出现两条消息“确定要关闭此窗口吗?”


这是Firefox的一个bug,我已经解决了,但我仍然希望有一种方法来防止这种情况发生。您能想出一种明智的方法在卸载前检测双重消息以防止双重消息问题吗?问题是Firefox没有告诉我用户选择单击对话框中的哪个按钮-确定或取消。

在处理程序中创建一个设置为true的全局变量。仅当此变量为false时显示警报/弹出窗口。

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

这绝对是一个FF错误。我在

上报告过,我发现最好的解决方案是使用一个flag全局变量,该变量在这么多毫秒(比如500毫秒)后重置(这确保函数可以再次调用,但不能在它出现后立即调用)

请参阅中的最后一个代码:


var onBeforeUnloadFired=false;
window.onbeforeunload=函数()
{
如果(!onBeforeUnloadFired){
onBeforeUnloadFired=true;
event.returnValue=“您已尝试离开此页面。如果未单击“保存”按钮对字段进行任何更改,您的更改将丢失。确实要退出此页面吗?”;
}
setTimeout(“ResetOnBeforeUnloadFired()”,10);
}
函数ResetOnBeforeUnloadFired(){
onBeforeUnloadFired=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++;




});
$(window).bind(“beforeunload”,function(){

如果(MTG.exitCount我发现,与自己调用confirm()不同,只需在beforeunload事件中执行偶数.preventDefault();即可。Firefox会弹出自己的确认对话框。
我不确定这样做是否正确/标准,但他们就是这样做的。

我在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();

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

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...
我看到这个页面是因为这个事件实际上触发了两次。我发现它不是一个bug,它触发了两次,因为它触发了一次“关于:空白”页面被你的页面替换,另一次触发了你的页面被卸载

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

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

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

但是如果用户取消关闭怎么办?那么,下次他们尝试关闭窗口时,对话框根本不会弹出。如果您使用的是
confirm()
对于警告消息,您可以检测用户是否取消关闭,并相应地设置全局变量。背景:如果您从beforeunload处理程序返回任何内容,则会出现一个对话框,提示“是否确实要关闭”然后由浏览器显示,并将返回值合并到文本中。我不知道用户是否单击了“确定”或“取消”。啊,我误解了问题的范围。这是FF中的一个错误。我没有遇到Vista上的FF3.0.15的问题。但是,什么是合理的超时值?将其设置得太短且用户速度较慢最终会看到两次对话框。设置得太长和太快,用户根本看不到对话框-这是不应该发生的事情,因为这可能会导致他们丢失数据。您可能会将其设置得很短。我假设卸载前的两个调用相隔几毫秒。将超时设置为100ms左右,然后Boone wi我知道它就在那里。但是,每当用户按下第一个对话框上的“确定”按钮时,就会出现第二个呼叫。与任何窗口相关的错误,而不仅仅是弹出窗口:。2005年打开,在最新的Firefox中仍在发生。
function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}