javascript - 如何使用用户脚本完全禁用所有退出警告/确认消息?

标签 javascript jquery google-chrome userscripts tampermonkey

我在一个孤立的环境中使用 chrome 来扫描恶意网站以分析它们的数据以创建黑名单。此过程由用户脚本和浏览器扩展程序完全自动化。

问题是某些站点能够在 beforeunloadunload 上显示退出对话框(我将这些称为 事件) .

我已经覆盖了这些事件,但是当站点再次覆盖我的覆盖时,整个过程停止了。我的意思是他们可以使用 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/

相关文章:

javascript - bootstrap datepicker,beforeShowDay 在第二次点击后起作用

javascript - 是否有适用于 Angular 2 的实时样式指南生成器,很像适用于 React 的样式指南?

javascript - promise 决心成功吗?

java - 如何取消chrome浏览器中的复选框

javascript - d3js过渡步骤函数

javascript - 如何在数据表php中添加一个复选框

jquery - 检测页面是否加载完成

javascript - 如何使用 JQuery 动态更改多段线中点的值?

google-chrome - Google Chrome 浏览器支持哪些协议(protocol)?

macos - 如何强制 Mac OS 在 Chrome 中打开 "Search with Google"