禁用 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;
}
});
我正在尝试创建一个禁用所有页面上的 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;
}
});