【问题标题】:Remove Alert box before it pops up [duplicate]在弹出警报框之前删除它[重复]
【发布时间】:2010-03-03 20:44:33
【问题描述】:

我正在尝试使用 Grease Monkey 和 jQuery 删除外部站点上的警报框。

HTML:

<!DOCTYPE html>
<html>
<body>

<script>alert("Remove this Alert box with GreaseMonkey.");</script>

<p>Hello world</p>

</body>
</html>

GreaseMonkey 脚本(目前没有 jQuery 部分):

// ==UserScript==
// @name        Remove Alert box
// @include     http://www.example.com/alert_remove/
// ==/UserScript==

var node = document.getElementsByTagName('alert');
node.parentNode.removeChild(node);

if(window.alert) {
    alert("ALERT DETECTED");  // No response.
}

我认为这不能使用 jQuery 解决,因为 jQuery 代码仅在页面加载并且警报可见时触发 ($(document).ready)。

我可以从 DOM 中删除警报元素吗?
如果出现警报,我可以发送按键 (13=Enter) 来处理警报吗?

谢谢。

【问题讨论】:

    标签: javascript jquery greasemonkey


    【解决方案1】:

    Greasemonkey 在页面加载之前不会运行,因此 Greasemonkey 无法做到这一点。如果你真的下定了决心,你可以设置一个代理(比如squid),方法类似于Upside-Down-Ternet这个技巧中使用的方法。

    如果您可以在其他代码调用 alert 之前运行您自己的 JavaScript,那么您可能需要执行以下操作:

    window.backupAlert = window.alert;
    window.alert = function () {return true};
    

    (测试工作)

    然后您可以在自己的脚本中使用backupAlert 函数代替alert,但假设alert 仍然存在的其他脚本不会显示弹出窗口。

    这样做的原因是 alert 是 window 对象内部的一个函数;它不是文档中的标签或 DOM 对象。

    不,您不能使用 JavaScript 发送按键。这在全球范围内都是正确的;您可以触发处理按键事件的函数,但您不能发送操作系统点击或按键事件。

    【讨论】:

    • 有趣的解决方案。当警报弹出时简单地发送一个按键(Enter)怎么样?可以用 AutoHotkey 来完成,但是用 JavaScript 呢?
    • 不,遗憾的是没有按键发送机制。您可以检测按键并处理它们,您可以触发您定义的按键处理程序,但是无法在网页之外(包括在警报窗口中,在浏览器的其他区域等)模仿按键事件
    【解决方案2】:

    由于 Greasemonkey 是在页面之后加载的,并且脚本不是由任何事件触发的,所以我认为不可能实现您想要的。

    【讨论】:

      【解决方案3】:

      var node = document.getElementsByTagName('alert');
      node.parentNode.removeChild(node);

      • 它根本不起作用,因为“alert”不是节点,但“script”是。如果您在显示警报之前设法执行了 GreaseMonkey 脚本,则必须改为:

      var node = document.getElementsByTagName('script')[0];
      var str = node.firstChild.textContent;
      var 结果 = str.replace(/alert("[\w\s.]*");/, "");
      node.firstChild.textContent = 结果;

      • 在 FireFox 中测试。那里发生了什么-您查找第一个脚本标记(可以很容易地查看所有这些标记),然后获取其内容(代码),然后将警报替换为空字符串并将修改代码放回去。在您的情况下,结果页面仍将带有脚本标记,但没有任何代码;

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        我不确定是否使用 javascript,因为 js 已经在渲染页面上运行。我的第一个想法是在页面呈现之前捕捉它。就像 PHP 一样。将外部站点的内容读入字符串并去掉 ALERT 代码行,然后显示页面。

        【讨论】:

          猜你喜欢
          • 2021-01-10
          • 1970-01-01
          • 2017-03-26
          • 2012-08-28
          • 1970-01-01
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          相关资源
          最近更新 更多