防止绑定到对象的JavaScript事件被覆盖

时间:2015-02-26 15:38:35

标签: javascript javascript-events

我做:

// Can be edited
window.onbeforeunload = function(){
    console.log("A")
}

然后:

// Cannot be edited (for example, this code appears in 3rd party library)
window.onbeforeunload = function(){
    console.log("B")
}

然后我刷新页面并看到" B"在控制台日志中。预期。但我想防止第二次绑定实际发生。基本上,我想锁定一个事件并防止它被永远覆盖(在页面生命期间)。结果,我想看到" A"在控制台登录页面刷新。

注1 :我无法使用console.log(" B")编辑部分代码,因为它可能出现在第三方JS库中。

注2 :需要Crossbrowser解决方案。

2 个答案:

答案 0 :(得分:4)

这似乎有效:

window.onbeforeunload = function() { return "HI!"; };

Object.defineProperty(window, 'onbeforeunload', {
  writable: false
});

window.onbeforeunload = function() { return "BYE!"; };

答案 1 :(得分:3)

无法密封像您一样的window属性。

但是,如果您将代码更改为使用window.addEventListener(),则可以阻止事件传播到其他事件侦听器:

window.addEventListener('beforeunload', function (e) {
    e.stopImmediatePropagation();
    console.log('A')
});

window.addEventListener('beforeunload', function (e) {
    e.stopImmediatePropagation();
    console.log('B')
});

A将在unload上打印到控制台。

http://jsfiddle.net/voqb78hp/4/