在IE中,onBeforeUnload处理程序显示为null。

15

我的 Web 应用有这个功能:

$(window).bind('beforeunload', function() {
    if(unSavedChanges == true)
    {
        return 'You have unsaved changes';
    }
    return null;
});

在Safari和Firefox中,这段代码运行得很好(除了Firefox不会在其onBeforeUnload对话框中显示我的自定义消息)。然而,在Windows 7上的IE 8中,它总是会显示onBeforeUnload通知,特别是如果没有未保存的更改,它只会说“null”。当用户保存所有内容并想要导航到其他页面时,如何防止IE显示onBeforeUnload通知?

根据Jon的建议,我已经删除了return null这一行,现在代码如下:

$(window).bind('beforeunload', function() {
   if(unSavedChanges == true)
   {
       return 'You have unsaved changes';
   }
});

1
第二个代码块已经是正确的解决方案了,对吧?对我来说,如果我们编辑问题以至于我们不能一眼看出哪个代码有问题,哪个没有问题,那么这会让我有点困惑。 - NilsB
2个回答

21

删除return null这一行就可以了(在Javascript中,nullundefined是不同的东西)。

顺便说一句,MDN上说,为了最大限度地提高兼容性,您应该接受一个event参数,并将event.returnValue设置为相应的值。


不适用于IE8,正在检查IE9。 - user83950
@ishaq:在我的IE9中可以正常工作(使用开发人员工具配置为“浏览器模式:IE 8”)。您能否发布一下不起作用的确切代码? - Jon
你说得对,是我的错!这段 JavaScript 代码是 Rails 应用程序的一部分,在经过资源管道处理后,代码最终会变成这样:return unsavedChanges ? "You have unsaved changes":null; - user83950
我会看看能否解决这个问题,也许我会把这个特定的JS片段放到application.js中,以防止它通过资产管道。 - user83950
关闭了资源压缩,已修复。 - user83950
显示剩余3条评论

0

我使用普通的JavaScript,它可以正常工作。

function setConfirmUnload(on) {
     window.onbeforeunload = (on) ? unloadMessage : null;
}

function unloadMessage() {
     return 'Please stay on the page';
}

1
这样做是行不通的,它根据“on”的值设置了“onbeforeunload”,一旦设置,它就会始终触发。要求是在“onbeforeunload”内部检查是否有未保存的更改。 - user83950
如果他将setConfirmUnload函数绑定到文本字段的onchange事件上,它应该可以工作。这样,当文本字段被清除时,onbeforeunload函数就会被移除。 - Wulf

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