Firefox 4 onBeforeUnload 自定义消息

Posted

技术标签:

【中文标题】Firefox 4 onBeforeUnload 自定义消息【英文标题】:Firefox 4 onBeforeUnload custom message 【发布时间】:2011-07-20 21:42:25 【问题描述】:

在 Firefox 3 中,我可以编写一个自定义确认弹出窗口:

window.onbeforeunload = function() 
   if (someCondition) 
      return 'Your stream will be turned off';
   

现在在 Firefox 4 中,它不会显示我的自定义消息。它提供的默认消息甚至与我的应用程序所做的都不准确。

可以覆盖此默认消息吗?

【问题讨论】:

Crossbrowser onbeforeunload?的可能重复 【参考方案1】:

来自MDN:

请注意,在 Firefox 4 及更高版本中,返回的字符串不会显示给用户。请参阅错误588292。

这个“Bug”实际上是一个(恕我直言有问题的)功能..所以无法在 Firefox 4 中显示该消息。如果您认为应该更改,请评论该错误,以便 Firefox 开发人员知道人们实际上希望能够显示自定义字符串。

【讨论】:

这可用于善恶。 GOOD:警告某人您的网络广播将被关闭,未保存更改,... BAD:具有反向心理的病毒站点:“单击取消以不安装病毒” . 这绝对是一个功能。与离开已输入数据的页面相关的问题是普遍存在的。我不需要更激进的警告,因为 99% 的此类消息令人讨厌或具有误导性。您的应用并不特别。 例如,我的网络收音机有一个 Flash 播放器,当它运行时,我正在显示“如果您关闭此页面,则流将停止播放”消息。这与“您可能会丢失数据”完全不同。 与我的网络应用程序相同。没有数据会丢失。网络广播将停止。在进行用户测试时,我注意到很多人不了解网络直播的本质。他们不知道当浏览器关闭时,他们的网络广播就会停止。他们认为它的工作方式类似于 Youtube,您只需上传一次,它就会永远保留在云端。 我的应用程序有很多原因可能会阻止您。也许有些东西没有保存,也许有些东西处于错误状态,也许 AJAX 请求还没有返回,所以我想请你稍等一下。我至少应该能够告诉用户他们被阻止的原因,否则他们怎么知道如何修复它?我认为应该有一个明显的默认消息(“您输入的数据可能不会保存”)和一个明显的“自定义”消息(显然来自页面,而不是浏览器)。就像上面写着“广告”的广告一样,这样用户就不会被误导。【参考方案2】:

除了上述答案之外,我还改进了解决方法。

我在这里使用过 jquery。你也可以使用默认的javascript函数。

$(window).bind('beforeunload', function() 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) 
        if(confirm("Are you Sure do you want to leave?")) 
            history.go();
         else 
            window.setTimeout(function() 
                window.stop();
            , 1);
        
     else 
        return "Are you Sure do you want to leave?";
    
);

在 Firefox 11 中也经过测试和工作。 :)

【讨论】:

@Nasif,首先是优秀的代码。但是你的 window.setTimeout(function() window.stop(); , 1);单击 Firefox 选项卡的 x 即关闭按钮时不起作用。而“离开窗口”的默认弹出窗口确实有效。 是的,上面的代码是用于页面离开,而不是用于关闭窗口谢谢。 天哪!这完全绕过了 Mozilla 的“安全”修复。感谢上帝,因为我需要卸载消息,但这是完全错误的。 Mozilla 绝对应该防止这种情况发生,但也要防止人们试图通过恢复卸载消息来找到解决方法!愚蠢的决定。 遗憾的是,无法将您自己的消息注入到 Firefox 对话框中:mxr.mozilla.org/mozilla-central/source/layout/base/…。 developer.mozilla.org/en-US/docs/Mozilla_event_reference/… 也具有误导性,returnValue 变为布尔值,实际上并未显示。 在 Firefox 23 中不起作用。似乎已在 Firefox 17 中删除:bug 391834【参考方案3】:

我的解决方法是在 onbeforeunload 中显示警报:

window.onbeforeunload=function() 
    if ( /Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) 
        alert("Blah blah. You have to confirm you are leaving this page in the next dialogue.");
    
    return "Blah blah."; 
 

(它在 Firefox 中显示两个对话,在其他地方显示一个对话。)

【讨论】:

这会在关闭标签页/浏览器时显示两个对话框,不是吗? @ThdK:是的,它显示了两个对话,我在帖子中添加了注释。 如果你删除这行'return "Blah blah."; ' 它只显示第一个对话框 @gomes return 语句至关重要。我们要显示第二个确认离开或留下对话。如果你删除它,你就只有警告对话框。 @xmedeko 是的,但如果你用确认对话框替换它,它与第二个对话框相同,除了确认按钮。请参阅下面的答案。【参考方案4】:

尝试使用确认消息来实现它,

window.onbeforeunload=function()
   return confirm("Are you sure??");

当然,当用户确认时,会显示 FF4 消息, 所以你最好在登录/访问时在每个站点上显示一次。 cookie 应该可以解决问题。

【讨论】:

即使用户对“你确定吗??”说不对话框,它不会阻止显示 FF4 消息或尝试卸载页面。 是的,但这允许你给用户一个消息,至少在这个 Bug 被修复之前,我建议一个警报,但似乎卸载没有显示任何确认问题 根据 html5 规范调用提示、警报、确认等可能会被忽略。就我而言,确认不起作用。

以上是关于Firefox 4 onBeforeUnload 自定义消息的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 Firefox 中的“离开页面”确认对话框?

JS捕获关闭浏览器事件之chrome浏览器真支持onbeforeunload事件吗

ExtJS 4.1:卸载事件

在 Firefox 29 扩展中禁用 beforeunload 对话

onbeforeunload和onunload

JavaScript离开页面前提示