Mozilla firefox 不适用于 window.onbeforeunload

IT技术 javascript jquery firefox dom-events onbeforeunload
2021-02-23 20:18:49

我正在使用window.onbeforeunload在 Windows 关闭时向用户显示一条消息,该功能在 Chrome 和 IE 上运行良好,但不适用于 Firefox,我使用的是 Firefox 版本,26.0我尝试了很多但没有任何意义,有人说它是 Firefox 中的一个错误,如这篇文章中所示 ,另一个建议了一些解决方案,如这篇文章中我尝试了所有使用 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-AgentHeader来知道浏览器的类型,confirmExamClose是我向用户显示的消息。

4个回答

这是 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;
});
虽然这有效,但确认消息未显示在 Firefox 上。去寻找方法来做到这一点......
2021-04-24 20:18:49
我不明白,上面的代码是显示确认信息,如果你不想显示它然后在你的html中注释掉上面的代码。
2021-05-04 20:18:49
这是 firfox 行为 @Jim,firefox 不允许显示自定义消息。
2021-05-06 20:18:49
@faisale 我不想 shoq 确认消息,我怎样才能做到这一点?
2021-05-07 20:18:49

我花onbeforeunload了 2 天的时间寻找 Firefox解决方案,但没有运气,所以我努力工作,并用一个小技巧做到了。

在我的技巧中,用户需要至少单击浏览器窗口一次。如果用户点击窗口,然后点击后退按钮,刷新页面,或试图退出页面,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>

使用 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';
};

这是文档:Mdn window.onbeforeunload doc

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

您可能想要做的是删除浏览器嗅探,然后执行以下操作:

window.onbeforeunload = confirmExamClose;
运行处理程序工作正常。不再允许从 beforeunload 处理程序(除了通过返回 false)发出对话框,因为太多站点正在滥用它。
2021-04-30 20:18:49