Javascript 在卸载之前或在卸载之前

Javascript 在卸载之前或在卸载之前,javascript,dom-events,onbeforeunload,Javascript,Dom Events,Onbeforeunload,我一直在想我应该使用哪一个:beforeunload或onbeforeunload它们看起来做的事情非常相似,但浏览器兼容性不同 某些上下文: 我有一张表格。在页面加载时,我序列化表单并将其保存在变量中。如果用户离开页面,我将序列化表单并比较两者,以查看是否有任何更改。但是,如果表单已提交,则不应触发事件 示例1 我让它按预期工作。我只是不明白两者之间的区别: window.onbeforeunload = function(e) { if(strOnloadForm != strUnl

我一直在想我应该使用哪一个:
beforeunload
onbeforeunload
它们看起来做的事情非常相似,但浏览器兼容性不同

某些上下文

我有一张表格。在页面加载时,我序列化表单并将其保存在变量中。如果用户离开页面,我将序列化表单并比较两者,以查看是否有任何更改。但是,如果表单已提交,则不应触发事件

示例1

我让它按预期工作。我只是不明白两者之间的区别:

window.onbeforeunload = function(e) {
    if(strOnloadForm != strUnloadForm)
        return "You have unsaved changes.";
}
保存表单时,使用此行停止它的触发(绑定到
.submit()

示例2

window.addEventListener("beforeunload", function( event ) {
    if(strOnloadForm != strUnloadForm)
        event.returnValue = "You have unsaved changes.";
});
保存表单时,使用此行停止它的触发(绑定到
.submit()

文档说明的内容

我已经阅读了和的文档。 在
onbeforeuload
部分下,它指出:

您可以并且应该通过和事件处理此事件。这里有更多的文档

这让我觉得我应该使用后者。但是,该文件说明:

addEventListener()
removeEventListener()
在旧浏览器中不存在。您可以通过在脚本开头插入以下代码来解决此问题,允许在本机不支持的实现中使用
addEventListener()
removeEventListener()

有人能解释一下它们之间的区别吗?请告诉我最好用哪一种


一,
2

window.onbeforeunload=function(){/**/}
将覆盖任何现有的处理程序,并将其替换为您自己的处理程序

window.addEventListener(“beforeunload”,function(){/**/})将添加一个新的处理程序

addEventListener
是首选。在较旧的浏览器中(即:IE6或IE7),您可以使用
attachEvent

您通常会看到如下代码:

function addEvent(object, event_type, event_handler) {
    if (object.addEventListener) {
        object.addEventListener(event_type, event_handler, false);
    } else {
        object.attachEvent("on" + event_type, handler);
    }
}

这是完全相同的事件,但当使用addEventListener时,您总是保留“开”部分。谢谢,这很有意义,实际上只是触发相同事件的另一种方式。好的,谢谢。如果知道,
onbeforeunload
将覆盖任何处理程序,而使用
addEventListener
则会添加一个处理程序,这是非常合理的。
window.removeEventListener("beforeunload");
function addEvent(object, event_type, event_handler) {
    if (object.addEventListener) {
        object.addEventListener(event_type, event_handler, false);
    } else {
        object.attachEvent("on" + event_type, handler);
    }
}