Firefox 4 onBeforeUnload自定义消息


69

在Firefox 3中,我能够使用以下命令编写自定义确认弹出窗口:

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

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

火狐4确认

可以覆盖此默认消息吗?


Answers:


52

MDN

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

这个“错误”实际上是一个(恕我直言有疑问的)功能。因此,无法在Firefox 4中显示此消息。能够显示自定义字符串。


9
这可以用于善与恶。良好:警告某人您的网络广播将被关闭,未保存的更改,...不良:采取相反心理的病毒站点:“单击取消以不安装病毒”。
JoJo

2
这绝对是一个功能。留下与在其上输入数据的页面有关的问题是普遍的。我不需要更激进的警告,因为99%的此类消息令人讨厌或误导。您的应用并不特殊。
韦恩

18
嗯,例如,我的webradio有一个Flash Player,当它运行时,我会显示“如果关闭此页面,流将停止播放”消息。这与“您可能会丢失数据”完全不同。
ThiefMaster 2011年

5
与我的Web应用程序相同。没有任何数据丢失。网络广播将停止。在进行用户测试时,我注意到很多人不了解实时网络广播的本质。他们不知道关闭浏览器后,网络广播会停止。他们认为它的工作方式类似于Youtube,您只需将其上传一次就可以永久保存在云中。
JoJo

17
我的应用程序有很多原因可能会阻止您。也许有些东西没有保存,也许有些东西处于错误状态,也许还没有返回AJAX请求,所以我想请您稍等一下。我应该至少能够告诉用户为什么他们被停止了,否则他们将如何解决?我认为应该有一个明显的默认消息(“您输入的数据可能不会保存”)和一个明显的“自定义”消息(显然来自页面,而不是浏览器)。就像在广告上方说“广告”的广告一样,这样用户就不会被误导。
Slobaum 2011年

32

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

我在这里用过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中也经过测试和工作。:)


4
@Nasif,首先是出色的代码。但是您的window.setTimeout(function(){window.stop();},1); 单击Firefox选项卡的x即关闭按钮时不起作用。而“弹出窗口”的默认弹出窗口确实有效。
user367134 2012年

是的,上面的代码用于页面离开,而不是用于窗口关闭。谢谢。
纳西夫(Nasif)2012

哦,我的上帝!这完全绕开了Mozilla的“安全性”修复程序。感谢上帝,因为我需要一个卸载消息,但这是完全错误的。Mozilla绝对应该避免这种情况的发生,但同时也应避免人们通过恢复卸载消息来试图找到解决方法!愚蠢的决定。
罗宾·温斯洛

不幸的是,无法将自己的消息注入Firefox对话框:mxr.mozilla.org/mozilla-central/source/layout/base/…developer.mozilla.org/zh-CN/docs/Mozilla_event_reference/…也会引起误解,returnValue变为布尔值,实际上并未显示。
Lekensteyn

5
在Firefox 23中不起作用。似乎已在Firefox 17中删除:bug 391834
Roman Starkov

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

@ThdK:是的,它显示了两次对话,我在帖子中添加了注释。
xmedeko 2012年

如果删除该行,请返回“ Blah blah”。“这只能说明在第一个对话框
戈麦斯

@gomes return语句至关重要。我们想显示第二个确认休假或停留对话。如果删除它,则只有警报对话框。
xmedeko 2015年

@xmedeko是的,但是如果将其替换为确认对话框,则与第二个对话框相同,除了确认按钮。请参阅下面的答案。
gomes

1

尝试通过确认消息实施它,

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

当然,当用户确认后,便会显示FF4消息,因此您最好在登录/访问时每个站点一次显示一次。Cookie应该可以解决问题。


1
即使用户拒绝“您确定吗?” 对话框,它不会阻止FF4消息显示,也不会阻止页面尝试卸载。
2011年

是的,但这可以使您至少在修复此错误之前向用户提供消息,我建议发出警报,但是似乎卸载后没有显示任何确认的问题
Jguru

1
根据HTML5规范,对提示,警告,确认等的调用可能会被忽略。就我而言,确认无效。
IntelliData 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.