Javascript 如何使用userscript完全禁用所有退出警告/确认消息?

Javascript 如何使用userscript完全禁用所有退出警告/确认消息?,javascript,jquery,google-chrome,userscripts,tampermonkey,Javascript,Jquery,Google Chrome,Userscripts,Tampermonkey,我在一个孤立的环境中使用chrome扫描恶意网站,分析其数据,创建黑名单。这个过程完全由用户脚本和浏览器扩展自动完成 问题是,一些站点能够在卸载之前在或卸载之前显示退出对话框(我将这些称为事件) 我已经覆盖了这些事件,但当站点再次覆盖我的覆盖时,整个过程停止。我的意思是,他们可以通过AJAX调用、模糊脚本、eval等重新定义事件 有什么方法可以删除这些消息,或者保护我的覆盖? 也许unsafeWindow可以处理这个问题,但我会避免在这种恶劣的环境中使用它 编辑-目前我在用户脚本中使用以下代码:

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

问题是,一些站点能够在卸载之前在
卸载之前显示退出对话框(我将这些称为
事件

我已经覆盖了这些
事件
,但当站点再次覆盖我的覆盖时,整个过程停止。我的意思是,他们可以通过AJAX调用、模糊脚本、eval等重新定义
事件

有什么方法可以删除这些消息,或者保护我的覆盖? 也许unsafeWindow可以处理这个问题,但我会避免在这种恶劣的环境中使用它

编辑-目前我在用户脚本中使用以下代码:

location.href = "javascript:(" + function() {
    window.onbeforeunload = null;
    window.onunload = null;
} + ")()";

setInterval(function(){
    location.href = "javascript:(" + function() {
        window.onbeforeunload = null;
        window.onunload = null;
    } + ")()";
}, 3000);
试一试


configurable
设置为false,这意味着无法更改属性。

我假设您使用的是较旧版本的Chrome,因为自Chrome 51[]以来,此行为已被删除

此问题取决于
onBeforeUnload
事件。浏览器(至少是Chrome和Firefox)禁用了来自
onUnload
事件内部的消息。您试图挂接计时器并更改
窗口的页面。onbeforeunload=null
可能也在使用计时器以非常小的间隔值(甚至1毫秒)设置同一事件,因此,如果让间隔较小的其他计时器一次又一次地设置该事件,则很难覆盖该事件。我的方法是杀死脚本中的所有计时器,我在一个旧VM中使用Chrome49时,它对我起了作用

// ==/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);

})();
对于reference测试页面,我使用了这个简单的javascript,它运行一个间隔计时器来设置
窗口

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(){}
函数。

1。添加您现在正在使用的代码,以阻止这些事件进入问题。2.基本上,我认为您需要使用所有可以想象的技巧,例如,在定义jQuery时重写
unsafeWindow
中的事件,处理
unsafeWindow.jQuery.\u数据(unsafeWindow.window,“events”)
,等等。一段时间内的重写(true){}几乎在任何情况下都会起作用,但我不想使用太多的资源。我认为定位黑客在现代浏览器中不起作用,或者在新版本的测试版结束后的几个月内将停止工作。例如,在windows上,这些事件仍在最新的Chrome版本59.0.3071.115(64位)中发生。使用它们的网站的一个例子是Reddit——只需单击一个回复,输入一些文本,然后关闭窗口或选项卡,您就会看到“请假确认”弹出窗口。@alzee只有在有表单且用户已用一些数据填充表单时,
onBeforeUnload
事件才会触发。你只是在评论中说的;你必须输入一些文本,弹出窗口才会出现,否则它不会弹出。如果您只是在没有表单和用户填充的数据的页面中为它设置侦听器,它将不再触发。您是否可以提供一个链接,该弹出消息在关闭时自动显示,而用户未向表单中填写一些数据?@alzee如果脚本仅适用于您,您需要禁用这些弹出窗口,则您应该尝试使用选项
-禁用重新发布提示
,启动Chrome。这将禁用这些消息。我不认为可以通过javascript以编程方式禁用它。顺便说一句,这个
Greasemonkey/Tampermonkey
脚本使用的代码是从2011年开始发布的,对于
Greasemonkey/Firefox
来说,
disable prompt on repost
标志是用于不同的用途——防止表单在刷新时提交。那面旗子在这里帮不了什么忙。下面是一个我希望脚本修复的示例:仅供参考,您引用的链接是一个错误修复,它只会阻止网站在弹出窗口中显示自定义文本,而不会阻止弹出窗口显示在第一个位置,这正是我和原始提问者希望出现的情况。
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);