javascript - 检测 DOM 中的变化

标签 javascript dom mutation-events mutation-observers

我想在 html 中添加一些 div 或输入时执行一个函数。 这可能吗?

例如,添加一个文本输入,那么应该调用该函数。

最佳答案

迄今为止的终极方法,代码最少:

(IE11+、FF、Webkit)

Using MutationObserver and falling back to the deprecated Mutation events if needed:
(Example below if only for DOM changes concerning nodes appended or removed)

var observeDOM = (function(){
  var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

  return function( obj, callback ){
    if( !obj || obj.nodeType !== 1 ) return; 

    if( MutationObserver ){
      // define a new observer
      var mutationObserver = new MutationObserver(callback)

      // have the observer observe for changes in children
      mutationObserver.observe( obj, { childList:true, subtree:true })
      return mutationObserver
    }
    
    // browser support fallback
    else if( window.addEventListener ){
      obj.addEventListener('DOMNodeInserted', callback, false)
      obj.addEventListener('DOMNodeRemoved', callback, false)
    }
  }
})()


//------------< DEMO BELOW >----------------

// add item
var itemHTML = "<li><button>list item (click to delete)</button></li>",
    listElm = document.querySelector('ol');

document.querySelector('body > button').onclick = function(e){
  listElm.insertAdjacentHTML("beforeend", itemHTML);
}

// delete item
listElm.onclick = function(e){
  if( e.target.nodeName == "BUTTON" )
    e.target.parentNode.parentNode.removeChild(e.target.parentNode);
}
    
// Observe a specific DOM element:
observeDOM( listElm, function(m){ 
   var addedNodes = [], removedNodes = [];

   m.forEach(record => record.addedNodes.length & addedNodes.push(...record.addedNodes))
   
   m.forEach(record => record.removedNodes.length & removedNodes.push(...record.removedNodes))

  console.clear();
  console.log('Added:', addedNodes, 'Removed:', removedNodes);
});


// Insert 3 DOM nodes at once after 3 seconds
setTimeout(function(){
   listElm.removeChild(listElm.lastElementChild);
   listElm.insertAdjacentHTML("beforeend", Array(4).join(itemHTML));
}, 3000);
<button>Add Item</button>
<ol>
  <li><button>list item (click to delete)</button></li>
  <li><button>list item (click to delete)</button></li>
  <li><button>list item (click to delete)</button></li>
  <li><button>list item (click to delete)</button></li>
  <li><em>&hellip;More will be added after 3 seconds&hellip;</em></li>
</ol>

关于javascript - 检测 DOM 中的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321415/

相关文章:

javascript - 带有扩展拉丁字母的正则表达式 (ä ö ü è ß)

php - 如何获取具有多个类名的元素?

jquery - 使用 DOMSubtreeModified 突变事件。在 jQuery 中

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

javascript - 我如何使用 mutationobserver 而不是突变事件?

javascript - 在 Here map 上隐藏/显示 map 标记

javascript - 哪个更好 : Using inbuilt Protractor/selenium functionalities OR Installing other node packages for protractor?

javascript - 如何修复缓慢、笨拙的 CSS 过渡?

c# - Css 每行显示 3 个 foreach 结果

javascript - "Editing"用户文本正在运行?