我能否使用谷歌Chrome扩展程序来阻止alert()弹窗?

17

我能否创建一个谷歌Chrome扩展程序来防止页面执行 alert()

3个回答

18

正如@MrGlass所说,目前Chrome扩展程序运行在一个独立的环境中,限制了对真实window对象的访问,并提供了一个仅适用于扩展程序的副本。

为了解决这个问题,我们可以直接向文档中注入一个脚本元素,这样就可以访问文档环境和真正的window对象。

首先,让我们创建这个函数(我也添加了"confirm",因为一些确认框太烦人了):

var disablerFunction = function () {

    window.alert = function alert(msg) { console.log('Hidden Alert ' + msg); };
    window.confirm = function confirm(msg) { 
        console.log("Hidden Confirm " + msg); 
        return true; /*simulates user clicking yes*/ 
    };

};
现在我们要做的是将该函数转换为文本脚本,并将其括在括号中(以避免与页面环境中实际变量可能发生的冲突):
var disablerCode = "(" + disablerFunction.toString() + ")();";

最后,我们插入一个脚本元素,然后立即将其删除:

var disablerScriptElement = document.createElement('script');
disablerScriptElement.textContent = disablerCode;

document.documentElement.appendChild(disablerScriptElement);
disablerScriptElement.parentNode.removeChild(disablerScriptElement);

1
运作得非常好! - martinczerwi
我使用 https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert 测试了你的代码,但它没有起作用,你能帮忙吗?https://github.com/redstoneleo/AlertRedirect - iMath
1
那么……像我这样的新手该如何实际运用这段代码呢? - Craig Smedley
这似乎也不再起作用了。拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'wasm-unsafe-eval'”。要启用内联执行,需要使用“unsafe-inline”关键字、哈希('sha256-023TBTjXBaEyavkxWzaAMQD3UROHGAcGufvEKId/DGc=')或nonce('nonce-...')。 - Dustin

16

是的,你可以。alert()只是JavaScript中的一个方法,你可以通过以下方式重写它的功能。

window.alert = function alert(msg) {
  console.log('Hidden Alert ' + msg);
};

记住,在manifest文件中通过run_at标识来运行content script,这样可以在文档开始时运行它。

我相信有一个扩展程序可以做到这一点。开发者把它命名为“Nice Alert”。 https://chrome.google.com/extensions/detail/ehnbelnegmgdnjaghgomaakjcmpcakhk


1
这种方法不再适用 = 在内容脚本中的 JavaScript 受到主页面的沙盒限制。这会改变内容脚本中的警报功能,但不会影响主页面。 - MrGlass
2
这是正确的,@MrGlass。请查看我的答案以了解如何解决这个问题。 - Daniel Möller

-5

谢谢。那很有帮助。不过,我意识到我需要这样做才能让它正常工作。

location.href="javascript: window.alert = function(x) {console.log(x)};"

如果我想要移除警告和确认框,我可以这样做:
location.href="javascript: window.alert = function(x) {console.log(x)}; window.confirm = function(){return true;};";

你如何将任何内容放入“javascript:”上下文中?当我尝试时,无法调用任何函数。 - David Jeske
不确定,抱歉。这可能是一个过时的答案了。我想知道为什么它会有那么多的踩。我认为可能是遇到了@MrGlass在之前问题中评论的问题。 - Drew LeSueur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接