javascript - 如何在不使用 DOM 突变事件的情况下检测 AJAX 节点插入?

标签 javascript jquery twitter greasemonkey mutation-events

我正在尝试编写一个 Greasemonkey 脚本来更改 Twitter 帖子中的关键字。问题是,内容是“延迟加载”的,是应用户请求添加的。

如果我要向添加的元素添加事件监听器,我可以使用 JQuery 的 delegate()。因为我只是想在加载时更改内容,所以这似乎不合适。

突变事件似乎符合要求。它们是 Gecko 特有的,但这对于 Greasemonkey 脚本来说并不重要。问题是,they have been depreciated和一组 very good reasons .

当然,我可以使用计时器并定期轮询 DOM,但这看起来很恶心。

如何检测 DOM 的添加并对插入的元素使用react?

最佳答案

如果您想检测 AJAX 创建的节点,您的选择(除了您明智地排除的 Mutation 事件之外)是:

  1. 使用间隔或计时器进行轮询。
  2. 尝试连接到页面的 AJAX 请求(如果有)。
  3. 拼接、劫持或替换页面的 javascript。

我一次完成了所有这些,但除了一个之外,所有的都有主要缺点:

  1. 拼接到页面的 javascript 并不总是那么容易(尤其是使用匿名函数),通常需要对该代码进行复杂的解构,而且非常脆弱。页面的 javascript 更改,恕不另行通知。
  2. Hook 到页面的 AJAX 请求有时非常容易,但跨沙箱屏障传输信息通常会带来更多麻烦,而不是它的值(value)。
  3. 轮询在实践中非常有效,易于实现,而且通常成本较低。

我建议您使用 the waitForKeyElements() utility并完成它。 它非常易于使用。例如:

// ==UserScript==
// @name    Highlight good comments
// @include http://SOME_SITE/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==

function highlightGoodComments (jNode) {
    if (/beer/i.test (jNode.text () ) ) {
        jNode.css ("background", "yellow");
    }
}

waitForKeyElements ("#userBlather div.comment", highlightGoodComments);

关于javascript - 如何在不使用 DOM 突变事件的情况下检测 AJAX 节点插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664669/

相关文章:

IE8 中的 Jquery UI : suspending sort behavior while resizing an element that is sortable and resizable

jquery - Google Maps API KML 图层更改每个图层的颜色

javascript - 帮助理解 twitters widget.js 文件,闭包中的闭包?

javascript - Python vs JavaScript - UTC 时间与序数时间

javascript - 超链接不会使用 jQuery 重定向用户

api - 检索用户时间线时超出 Tweepy 速率限制

php - Twitter 推文使用 "Codebird"删除

javascript - window.setTimeout 用于处理异步调用同步?

html - 自定义滚动条文本 chop 的问题

javascript - 不知道如何在 React Native 应用程序中使用 navigation.navigate