beforeunload或onbeforeunload

Ada*_*mat 21 javascript onbeforeunload javascript-events

我不知道我应该使用哪一个:beforeunload或者onbeforeunload它们似乎都做了非常相似的事情,但具有不同的浏览器兼容性.

一些背景:

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

例1

我按预期工作了.我只是不明白两者之间的区别:

window.onbeforeunload = function(e) {
    if(strOnloadForm != strUnloadForm)
        return "You have unsaved changes.";
}
Run Code Online (Sandbox Code Playgroud)

使用此行停止在保存表单时触发(绑定到.submit())

window.onbeforeunload = null;
Run Code Online (Sandbox Code Playgroud)

例2

window.addEventListener("beforeunload", function( event ) {
    if(strOnloadForm != strUnloadForm)
        event.returnValue = "You have unsaved changes.";
});
Run Code Online (Sandbox Code Playgroud)

使用此行停止在保存表单时触发(绑定到.submit())

window.removeEventListener("beforeunload");
Run Code Online (Sandbox Code Playgroud)

文档说的是什么

我已经阅读了onbeforeunload和beforeunload的文档.在Notesonbeforeunload部分下,它指出:

您可以并且应该通过window.addEventListener()和beforeunload事件来处理此事件.那里有更多文档.1

这让我觉得我应该使用后者.但是,removeEventHandler的文档说明了这一点:

addEventListener()并且removeEventListener()不存在于旧版浏览器中.您可以通过在脚本的开头插入以下代码来解决此问题,允许使用addEventListener()和removeEventListener()本身不支持它的实现.2

有人可以请一些关于这些请求的差异,以及最好的使用方法吗?


1 https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#Notes 2 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener #Polyfill_to_support_older_browsers

Hal*_*yon 31

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的谢谢.很明显,`onbeforeunload`会覆盖任何处理程序,而使用`addEventListener`会在你知道后添加一个. (4认同)