防止绑定到要重写的对象的JavaScript事件

防止绑定到要重写的对象的JavaScript事件,javascript,javascript-events,Javascript,Javascript Events,我有: 然后: // Can be edited window.onbeforeunload = function(){ console.log("A") } 然后我刷新一个页面,在控制台日志中看到“B”。预期。但我想防止第二次绑定实际发生。基本上,我想锁定一个事件并防止它永远被覆盖(在页面生命期内)。因此,我希望在页面刷新时看到控制台日志中的“a” 注意1:我无法使用console.log(“B”)编辑部分代码,因为它可能出现在第三方JS库中 注2:需要交叉浏览器解决方案。无法按要求

我有:

然后:

// Can be edited
window.onbeforeunload = function(){
    console.log("A")
}
然后我刷新一个页面,在控制台日志中看到“B”。预期。但我想防止第二次绑定实际发生。基本上,我想锁定一个事件并防止它永远被覆盖(在页面生命期内)。因此,我希望在页面刷新时看到控制台日志中的“a”

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


注2:需要交叉浏览器解决方案。

无法按要求密封
窗口的属性

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

// Cannot be edited (for example, this code appears in 3rd party library)
window.onbeforeunload = function(){
    console.log("B")
}
A
将在
unload
上打印到控制台

这似乎有效:

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

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

我只在Chrome上试过这个。我想知道它是否适用于其他浏览器:)在safari中不起作用:“TypeError:尝试更改不可配置属性的访问机制。”Firefox检测到一些东西,但在Firefox中不起作用。我怀疑它不兼容:)
window.onbeforeunload = function() { return "HI!"; };

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

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