HTML5包含"mutation observers"概念,用于监控浏览器DOM的更改。
您的观察者回调将传递看起来很像DOM树片段的数据。我不知道他们是不是这个或者他们是如何工作的。
但是当您编写代码以与无法控制的第三方网站进行交互时(例如使用Greasemonkey脚本或Google Chrome用户脚本),您必须检查传入的元素树以查找哪些信息是相关的给你。
选择器更简单,就像使用任何DOM一样,而不是手动遍历树,尤其是跨浏览器代码。
有没有办法使用jQuery选择器将数据传递给HTML5变异观察者回调?
答案 0 :(得分:48)
是的,您可以对返回到变异观察者回调的数据使用jQuery选择器。
假设你有这样的HTML:
<span class="myclass">
<span class="myclass2">My <span class="boldly">vastly</span> improved</span>
text.
</span>
你设置了一个观察者,如下:
var targetNodes = $(".myclass");
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var myObserver = new MutationObserver (mutationHandler);
var obsConfig = { childList: true, characterData: true, attributes: true, subtree: true };
//--- Add a target node to the observer. Can only add one node at a time.
targetNodes.each ( function () {
myObserver.observe (this, obsConfig);
} );
function mutationHandler (mutationRecords) {
console.info ("mutationHandler:");
mutationRecords.forEach ( function (mutation) {
console.log (mutation.type);
if (typeof mutation.removedNodes == "object") {
var jq = $(mutation.removedNodes);
console.log (jq);
console.log (jq.is("span.myclass2"));
console.log (jq.find("span") );
}
} );
}
你会注意到我们可以在mutation.removedNodes
上进行jQuery。
如果您从控制台运行$(".myclass").html ("[censored!]");
,您将从Chrome和Firefox获得此信息:
mutationHandler:
childList
jQuery(<TextNode textContent="\n ">, span.myclass2, <TextNode textContent="\n text.\n ">)
true
jQuery(span.boldly)
表明您可以在返回的节点集上使用普通的jQuery选择方法。
答案 1 :(得分:7)
我没有任何个人代码片段,但我有三个资源可能会有所帮助:
链接#3'jquery-mutation-summary'库的示例:
// Use document to listen to all events on the page (you might want to be more specific)
var $observerSummaryRoot = $(document);
// Simplest callback, just logging to the console
function callback(summaries){
console.log(summaries);
}
// Connect mutation-summary
$observerSummaryRoot.mutationSummary("connect", callback, [{ all: true }]);
// Do something to trigger mutationSummary
$("<a />", { href: "http://joelpurra.github.com/jquery-mutation-summary"}).text("Go to the jquery-mutation-summary website").appendTo("body");
// Disconnect when done listening
$observerSummaryRoot.mutationSummary("disconnect");
答案 2 :(得分:3)
我正在研究一个与我正在研究的Stack Exchange脚本非常相似的问题,我需要能够监视DOM的变化。 jQuery文档没有任何帮助,但我确实发现DOMNodeInserted事件在Chrome中有效:
document.addEventListener("DOMNodeInserted", function(event){
var element = event.target;
if (element.tagName == 'DIV') {
if (element.id == 'seContainerInbox') {
//alert($('#seContainerInbox').parent().get(0).tagName);
trimStoredItems();
$('#seTabInbox').click();
// var newCount = getNewCount();
// if there are new inbox items, store them for later
storeNewInboxItems();
applyNewStyleToItems();
}
}
});
我不是百分之百确定这是否适用于Firefox,因为我还没有在开发过程中那么远。希望这有帮助!
答案 3 :(得分:2)
我知道这是一个老问题,但也许这可以帮助其他人寻找替代解决方案。我最近了解了Mutation Observers,并想尝试将它们与jQuery一起使用。我提出了两种可能的方法,并将它们变成了插件。该代码可用here。
第一种方法(jquery.observeWithEvents.js
)使用jQuery的trigger()
函数来触发insertNode
或removeNode
事件,该事件可以通过jQuery的on()
函数绑定。第二种方法(jquery.observeWithCallbacks.js
)使用传统的回调参数。请查看README以获取示例和用法。