Mozilla Firefox与window.onbeforeunload无法正常工作

8
我正在使用 window.onbeforeunload 来在窗口关闭时向用户显示一条消息,在Chrome和IE中该函数运行良好,但在Firefox中不起作用。我使用的是Firefox版本 26.0,我已经尝试了许多方法,但没有一个有效。有人在这个帖子中说这是Firefox的bug,另一个提供了一些解决方案,如这个帖子所述。我已尝试所有可用的使用Javascript和jQuery的解决方案,但它们都不起作用。现在我展示一个确认对话框,但浏览器默认对话框在它之后出现,我对此感到不满意。我还尝试使用preventDefault()来防止浏览器默认对话框的出现,但也不起作用!如果有任何解决此问题的方法,那将是很好的。这是我如何使用 window.onbeforeunload:
<script>
window.onbeforeunload = confirmWinClose();
function confirmWinClose() {
     var myVar ='${isFireFox}';
     if(myVar=='true'){
         return confirm(confirmExamClose);
     }else{
         return confirmExamClose;
     }

}
<script>

注意:isFireFox是一个我用来了解浏览器类型的jsp变量,使用User-Agent头和confirmExamClose是我向用户显示的消息。

4个回答

15

这里是适用于Firefox和Chrome的可行解决方案。我还没有在Safari和Opera中进行测试。

var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
    var confirmationMessage = 'Are you sure to leave the page?';
    (e || window.event).returnValue = confirmationMessage;
    return confirmationMessage;
});

1
虽然这个可以工作,但确认消息在Firefox上没有显示。我要去寻找解决方法... - Jim
@Jim,这是Firefox的行为,它不允许显示自定义消息。 - faisale
@faisale 我不想显示确认消息,我该怎么做? - sadia
我不明白,上面的代码是用来显示确认消息的,如果你不想显示它,那么在你的HTML中注释掉上面的代码即可。 - faisale

5

我花了两天时间寻找Firefox的onbeforeunload解决方案,但没有成功,所以我努力研究了一下,并采用了一个小技巧。

在我的技巧中,用户需要至少单击浏览器窗口一次。如果用户单击窗口,然后单击后退按钮、刷新页面或尝试退出页面,则onbeforeunload事件将触发。

$(window).on('beforeunload', function () {
    return "Are you sure you want to exit this page?";
});
$(window).one('click',function(){
    alert('hi');
    $('.javavoid').trigger('click');
});
.hide{display:none;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
    <a class="hide javavoid" href="javascript:void(0)">asdf</a>
    <p>Welcome, click anywhere then click on back button or refresh page</p>
</body>


请注意,在FF 115版本中,只有在前一页的来源不同时才能正常工作。如果前一页和下一页的来源相同(例如从localhost:3000到localhost:3000),在返回时您将看不到该消息。 - 15 Volts

4

使用MDN提供的代码,我在Firefox/Chrome/IE11中测试成功(目前还没有尝试其他浏览器)。

window.onbeforeunload = function (e) {
  var e = e || window.event;

  // For IE and Firefox
  if (e) {
    e.returnValue = 'Any string';
  }

  // For Safari
  return 'Any string';
};

here is the doc : Mdn window.onbeforeunload doc


-1

你为什么要在这里进行浏览器嗅探?你的代码中的“Firefox”分支返回window.confirm的返回值,它是一个布尔值。但是布尔值不可调用,因此将其赋值给window.onbeforeunload与赋值null相同。

你可能想要做的是删除浏览器嗅探,只需执行以下操作:

window.onbeforeunload = confirmExamClose;

1
运行处理程序很好。除了返回false之外,从beforeunload处理程序中弹出对话框不再被允许,因为太多的网站滥用了这个功能。 - Boris Zbarsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接