如何在不使用 DOM 突变事件的情况下检测 AJAX 节点插入
How can I detect AJAX node insertion without using DOM mutation events?
我正在尝试编写一个Greasemonkey脚本来更改Twitter帖子中的关键字。问题是,内容是"延迟加载"的,并根据用户的要求添加。
如果我将事件侦听器添加到添加的元素中,我可以使用 JQuery 的 delegate()
。由于我只想在加载时更改内容,因此这似乎不合适。
突变事件似乎符合要求。它们是壁虎特有的,但这对 Greasemonkey 脚本来说并不重要。问题是,它们已经贬值了,并且有一系列很好的理由。
当然,我可以使用计时器并定期轮询 DOM,但这似乎很恶心。
如何检测 DOM 的添加并对插入的元素做出反应?
如果要检测 AJAX 创建的节点,您的选项(除了明智地排除的突变事件(是:
- 使用间隔或计时器进行轮询。
- 尝试挂钩到页面的 AJAX 请求(如果有(。
- 拼接到、劫持或替换页面的 javascript。
我已经一次完成了所有这些,除了一个之外,所有都有主要缺点:
- 拼接到页面的javascript并不总是那么容易(尤其是匿名函数(,通常需要对该代码进行复杂的解构,而且很脆弱。 页面的 JavaScript 更改恕不另行通知。
- 挂钩到页面的 AJAX 请求有时非常容易,但跨沙盒屏障传输信息通常会使其变得比它的价值更麻烦。
- 轮询在实践中效果很好,易于实现,而且通常成本低。
我建议您使用 waitForKeyElements(( 实用程序并完成它。它非常易于使用。 例如:
// ==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);
相关文章:
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不检查HTTP标头的情况下检测移动浏览器
- 对于如何在没有modernizr的情况下用边界半径的功能检测检查来替换我的旧浏览器检查
- 如何在javascript已经检测到的情况下将屏幕分辨率数据调整为web
- 为什么在设置了OnPush标志的情况下,Angular2在更改检测过程中同时捕捉到引用更改和基元更改
- 如何在不发出 HTTP 请求的情况下检测 SQL 数据库中的更改
- 在不使用jQuery的情况下检测javascript中的点击
- 如何在不使用 DOM 突变事件的情况下检测 AJAX 节点插入
- activateJavaScript.org如何在没有JavaScript的情况下检测您的浏览器
- 如何在没有加载事件的情况下检测Iframe何时更改位置并触发函数
- 如何在没有JavaScript库的情况下检测转换结束
- 在不使用pageYOffset的情况下检测轮子方向的Javascript(或其他语言)
- 如何在不轮询的情况下检测元素何时不再具有影子根
- 如何在不使用eval()或requireJS的情况下检测插件或脚本是否已经加载
- 这个文档是如何在根本没有设置的情况下检测到cookie的
- 如何在不重新加载的情况下检测页面导航?
- 如何在没有jQuery的情况下检测DOM元素的变化
- 在不使用用户代理的情况下检测javascript中的iPad
- 有没有办法在没有jquery的情况下检测窗口的位置
- 有没有可能在不使用isNaN的情况下检测到NaN ?