禁用 window.onbeforeunload 的用户脚本

Userscript to disable window.onbeforeunload

我正在尝试创建一个禁用所有页面上的 window.onbeforeunload 的用户脚本。我试过在 document_start:

处插入以下脚本
Object.defineProperty(window, 'onbeforeunload', {
    'value': null
});

这种方式window.onbeforeunload不能被页面上的任何其他脚本设置。这工作正常,除非页面包含另一个脚本,该脚本试图在启用严格模式的情况下设置 window.onbeforeunload,例如:

'use strict';
window.onbeforeunload = function(){
    return true;
};
//Script execution stops after this
console.log(window.onbeforeunload);

这会导致抛出异常并完全停止脚本执行,这似乎有点苛刻。

有什么方法可以防止设置 window.onbeforeunload,但不能使页面上的其他脚本在启用严格模式时完全停止执行?

谢谢!

改为 setter 属性,然后丢弃该值。

Object.defineProperty(window, 'onbeforeunload', {
    'set': function() {}
});

(function() {
'use strict';
window.onbeforeunload = function(){
    return true;
};
console.log(window.onbeforeunload);
})();

然后当某些东西试图将它设置为严格模式时,它只会被丢弃而不是抛出错误。

如果你想让它更加防弹,你可以覆盖 getter 和 setter,改为 return 你存储在变量中的函数。

var beforeUnload = null;
Object.defineProperty(window, 'onbeforeunload', {
    get: function () { return beforeUnload; },
    set: function (value) { beforeUnload = value; }
});

(function() {
'use strict';
window.onbeforeunload = function(){
    return true;
};
console.log(window.onbeforeunload);
console.log(typeof window.onbeforeunload);
})();

您可以更改设置函数,使其始终为空。

Object.defineProperty(window, 'onbeforeunload', {
  set: v => {
    return null;
  }
});