我在一个孤立的环境中使用 chrome 来扫描恶意网站以分析它们的数据以创建黑名单。此过程由用户脚本和浏览器扩展程序完全自动化。
问题是某些站点能够在 beforeunload
或 unload
上显示退出对话框(我将这些称为 事件
) .
我已经覆盖了这些事件
,但是当站点再次覆盖我的覆盖时,整个过程停止了。我的意思是他们可以使用 AJAX 调用、混淆脚本、评估等重新定义 events
。
有什么方法可以删除这些消息,或者保护我的覆盖吗? 也许 unsafeWindow 会处理这个问题,但我会避免在这种恶劣的环境中使用它。
编辑 - 目前我在用户脚本中使用此代码:
location.href = "javascript:(" + function() {
window.onbeforeunload = null;
window.onunload = null;
} + ")()";
setInterval(function(){
location.href = "javascript:(" + function() {
window.onbeforeunload = null;
window.onunload = null;
} + ")()";
}, 3000);
最佳答案
我假设您使用的是某些旧版本的 Chrome,因为自 Chrome 51 [ Custom messages in onbeforeunload dialogs (removed) 以来,此行为已被删除。 ].
问题依赖于 onBeforeUnload
事件。浏览器(至少是 Chrome 和 Firefox)已禁用来自 onUnload
事件的消息。您尝试 Hook 计时器并更改 window.onbeforeunload = null
的页面可能也在使用计时器以非常小的间隔值(甚至 1 毫秒)设置相同的事件,因此它会当有另一个间隔较小的计时器一次又一次地设置它时,真的很难覆盖该事件。我的方法是杀死脚本中的所有计时器,它适用于我在旧 VM 中使用的 Chrome 49。
// ==/UserScript==
(function() {
'use strict';
var killId = setTimeout(function() {
for(var i = killId; i > 0; i--) clearInterval(i);
window.onbeforeunload = null;
// If you don't use interval timers then disable setInterval function
// else you can store the function to a variable before
// you set it to an empty function;
// Same goes for setTimeout
setInterval = function() {};
}, 10);
})();
对于引用测试页,我使用这个运行间隔计时器的简单 javascript 来设置每毫秒 window.onbeforeunload
:
function goodbye(e) {
var msg = 'You sure you want to leave?';
if(!e) e = window.event;
if(e) {
//e.cancelBubble is supported by IE - this will kill the bubbling process.
e.cancelBubble = true;
e.returnValue = msg; //This is displayed on the dialog
//e.stopPropagation works in Firefox.
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
}
} else
return msg;
}
// Set a timer to hook `onBeforeUnload` event every millisecond
setInterval(function() { window.onbeforeunload = goodbye; }, 1);
某些页面可能使用 setTimeout()
而不是 setInterval()
因此您可能还想禁用 setTimeout = function() {}
函数.
关于javascript - 如何使用用户脚本完全禁用所有退出警告/确认消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958606/