javascript - 禁用 window.onbeforeunload 的用户脚本

标签 javascript userscripts

我正在尝试创建一个禁用所有页面上的 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,以返回一个你存储在变量中的函数。

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);
})();

关于javascript - 禁用 window.onbeforeunload 的用户脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900982/

相关文章:

javascript - 如何按数组中更多嵌套对象对 JavaScript 数组进行排序并获取顶部###?

javascript - 处理 <?xml-stylesheet> 类似于 <link rel ="stylesheet">?

jquery - 使用 jQuery 和 contains() 进行全字匹配

javascript - 使用用户脚本作为常规 JavaScript?

google-chrome - Chrome 用户脚本 (Greasemonkey) - 阻止 Gmail 发送电子邮件

javascript - 范围值仅从一个 Controller 接收更新

javascript - 保存已经用 Meteor 文件上传的文件信息

javascript - 仅当 JavaScript 加载后,链接才应变为可点击状态

javascript - 检测XHR请求

google-chrome-extension - 为什么对于 MacOS 上的 Greasemonkey/Tampermonkey 上的本地脚本,@require 总是给我错误“"couldn' t load @require from禁止的 URL”