jQuery – 在DOM更改时运行一个函数

到目前为止,我一直在使用livequery工作,但它使页面浏览看起来很慢。 所以我正在努力寻找替代解决方案。

我附加了一个函数,它在具有某个类的元素上运行一些ajax,如:

$(".blah").each(function(){ $.ajax({ ... success: function(data) { $(this).removeClass(".blah"); // do other stuff } }); }); 

现在我有几个事件挂钩在可以在DOM中附加html的不同元素,如:

 $(".button").click(function(){ $.ajax({ ... success: function(data) { $(this).append(data); // here, new elements with ".blah" class could be inserted in the DOM // the event above won't be fired... } }); }); 

当DOM在其他事件中更新时,我怎么能这样运行上面的第一个ajax函数呢?

更新:

我也找到了这个插件: http : //www.thunderguy.com/semicolon/2007/08/14/elementready-jquery-plugin/

你认为这是一个更好的解决方案吗? 从快速查看看起来,因为它允许您设置“轮询”间隔,如果将其设置为1秒或某些时间,可能会降低CPU使用率。 我正在测试它:)

更新2:

不幸的是,它仅适用于元素ID,原因有些奇怪:(

这是真的,因为新元素没有绑定到回调的事件,它们只是新的元素。 我建议在新创建的元素创建之后(即在ajax成功函数内)绑定事件:

  $(".blah").each(function(){ $.ajax({ ... success: function(data) { $(this).removeClass(".blah"); // add handlers to new elements with class "button" $(this).find('.button').click(function() { $.ajax({ success: function(data) { $(this).append(data); }); } }); } 

大多数主流浏览器(但遗憾的是IE <= 8)不支持DOM突变事件 (也见MDN )。 如果您只对添加到DOM的节点感兴趣,请使用DOMNodeInserted事件。 如果您想了解任何DOM更改,请使用catch-all DOMSubtreeModified事件。

例如:

 document.addEventListener("DOMNodeInserted", function(evt) { alert("Node inserted. Parent of inserted node: " + evt.relatedNode.nodeName); }, false); document.body.appendChild( document.createElement("div") ); 

2012年12月13日更新

DOM变异事件现已弃用,浏览器正逐渐转向变异观察者 。 目前最明智的策略似乎是使用突变观察者并回归突变事件。

我也遇到过这样的问题。 没有真正的方法让dom改变(我知道)。 我通过两种不同的方法来解决这个问题

  1. 让setTimeout每秒调用一次该函数,或者在用户移动鼠标时触发该函数。 如果处理不当,这两种情况都会导致减速
  2. 在ajax完成时调用一个函数。 因此,每次通过在成功部分中完成查询来调用doAjax()时都会调用它。

您还可以将第一个ajax查询绑定到body标记,因此,只要用户单击ajax事件将触发的内容,然后检查是否满足正确的条件。

编辑:这可能会有效。 添加$(“BODY ID / CLASS”)。change(function(){}); 不完全确定,因为我不是最流利的jQuery。

IE9 +,FF和Chrome:

 var observeDOM = (function(){ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver, eventListenerSupported = window.addEventListener; return function(obj, callback){ if( MutationObserver ){ // define a new observer var obs = new MutationObserver(function(mutations, observer){ if( mutations[0].addedNodes.length || mutations[0].removedNodes.length ) callback(); }); // have the observer observe foo for changes in children obs.observe( obj, { childList:true, subtree:true }); } else if( eventListenerSupported ){ obj.addEventListener('DOMNodeInserted', callback, false); obj.addEventListener('DOMNodeRemoved', callback, false); } } })(); observeDOM( $('#dom_element')[0] ,function(){ console.log('dom changed'); });