如何使用用户脚本覆盖警报功能?

IT技术 javascript alert greasemonkey userscripts tampermonkey
2021-03-02 05:39:06

现场有这样的代码(它的网站在局域网上)

<script language="JavaScript" type="text/javascript">         
    alert("ble");
</script>

我尝试使用 GM 禁用该警报。我试图这样做

unsafeWindow.alert=function() {};

但我看到警报并收到此错误

Error: uncaught exception: [Exception... "Component is not available"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: file:///C:/Documents%20and%20Settings/arokitnicki/Dane%20aplikacji/Mozilla/Firefox/Profiles/sm4bsods.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js :: anonymous :: line 377"  data: no]

如何禁用该警报?

PS 这不是一个 javascript问题,而是一个Greasemonkey问题。

编辑:

它公司的网站,所以我不能粘贴真实的代码

<head>
    <script>    
        dojo.require("dojo.back");
        dojo.back.init(); 
    </script>
</head>
<body onload="someMethod()">
    <iframe></iframe>
    <script>         
        alert("bla");
    </script>
</body>

header 中还有一些脚本和 CSS 声明。

2个回答

更新:对于现代版本的 Tampermonkey、Violentmonkey、Greasemonkey (但强烈建议避免 GM 4+)在大多数情况下,
您可以alert()使用@run-at document-start. 例如,加载这个脚本然后访问测试页面

// ==UserScript==
// @name    _Overwrite Alert
// @match   *://output.jsbin.com/*
// @grant   none
// @run-at  document-start
// ==/UserScript==

var alrtScope;
if (typeof unsafeWindow === "undefined") {
    alrtScope = window;
} else {
    alrtScope = unsafeWindow;
}

alrtScope.alert = function (str) {
    console.log ("Greasemonkey intercepted alert: ", str);
};

请注意,如果您正在运行 Tampermonkey,您可以通过切换到更有效地阻止警报Inject Mode: Instant
Tampermonkey Settings => Config mode: Advanced => Experimental => Inject Mode: Instant


如果您的脚本需要 GM_ functions,则它必须设置@grant为 none。在这种情况下,exportFunction()像这样使用

// ==UserScript==
// @name            _Overwrite Alert
// @match           *://output.jsbin.com/*
// @grant           GM_addStyle
// @run-at          document-start
// ==/UserScript==

function myAlert (str) {
    console.log ("Greasemonkey intercepted alert: ", str);
}
unsafeWindow.alert   = exportFunction (myAlert, unsafeWindow);


旧答案,对于 2011 年 8 月之前的 Greasemonkey:

unsafeWindow.alert=function() {}; 在特定情况下工作正常。

但是,如果这确实是页面上的代码,那么您将无法使用 Greasemonkey 停止该警报。

这是因为该警报将在页面加载期间和DOMContentLoaded事件之前触发 - 即触发 Greasemonkey 的时间。


加载这个 GM 脚本:

// ==UserScript==
// @name            Overwrite Alert
// @description     Overwrites alert()
// @include         http://jsbin.com/*
// ==/UserScript==

unsafeWindow.alert=function() {};


然后访问:http : //jsbin.com/ajeqe4/6

检查代码 ( http://jsbin.com/ajeqe4/6/edit ),您将看到 3 个警报。Greasemonkey 只能停止load(通常)触发的警报

其他因素可能会阻止 GM 停止警报的能力......页面加载速度过快或关闭,也许。


在 pastebin.com 上粘贴该页面的源代码,如果可能,请不要对其进行编辑。您可能还有其他事情可以做。也许通过adblock阻止脚本?

否则,您将不得不编写扩展/附加组件。

@01,是的,因为它是在 GM 之前执行的。
2021-04-22 05:39:06
非常感谢,我的公司不关心可用性,但我不经常使用该页面,所以没关系。如果我感到无聊,我可能会尝试编写附加组件。非常感谢您的帮助,现在我更了解 GM 的工作原理了。
2021-04-25 05:39:06
是的,这是正确的,只是不知道这是否是他的真正意思。
2021-04-26 05:39:06
@01:由于您的警报已编码到正文中并内联触发,因此 GM 无法阻止它。由于它不是从文件加载的,因此 adblock 无法阻止它。几乎您唯一的选择是在页面下载期间重写/过滤 HTML 的浏览器插件。 实际上,由于这是一个 LAN 且可用性极差,请向经理和 IT 人员投诉。您可能会在Jakob Nielsen 的优秀网站上找到弹药
2021-04-29 05:39:06
我已经粘贴了代码。我会看看 adblock,谢谢你的建议。如果您有任何其他想法,请分享。
2021-05-01 05:39:06

如果您使用Scriptish,那么以下内容将始终有效:

// ==UserScript==
// @id              alert-killer-test@erikvold.com
// @name            Overwrite Alert
// @description     Overwrites alert()
// @include         *
// @run-at          document-start
// ==/UserScript==

unsafeWindow.alert=function() {};

您可以在此处获取用户脚本