首页 > web前端 > js教程 > JavaScript 如何有效检测并响应 DOM 变化?

JavaScript 如何有效检测并响应 DOM 变化?

Mary-Kate Olsen
发布: 2024-12-23 10:31:30
原创
960 人浏览过

How Can I Effectively Detect and Respond to DOM Changes in JavaScript?

有效检测 DOM 更改

观察 DOM 中的更改对于创建响应用户交互的动态 Web 应用程序至关重要。一种广泛使用的方法涉及利用 MutationObserver,这是一种现代 API,可让您监视 DOM 修改。大多数现代浏览器都支持此方法,包括 IE11、Firefox 和 WebKit。

要实现此方法,您可以使用以下步骤:

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

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

    if (MutationObserver) {
      var mutationObserver = new MutationObserver(callback);
      mutationObserver.observe(obj, {childList: true, subtree: true});
      return mutationObserver;
    } else if (window.addEventListener) { // browser support fallback
      obj.addEventListener('DOMNodeInserted', callback, false);
      obj.addEventListener('DOMNodeRemoved', callback, false);
    }
  }
})();
登录后复制

此函数接受一个元素 (obj )和一个回调函数(callback)作为参数。每当元素或其子元素发生更改时,都会执行回调。

为了演示用法,请考虑以下示例:

<ol>
  <li><button>list item (click to delete)</button></li>
</ol>

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

  // delete item
  listEl.onclick = function(e) {
    if (e.target.nodeName == 'BUTTON') {
      e.target.parentNode.parentNode.removeChild(e.target.parentNode);
    }
  };

  // Observe a specific DOM element:
  observeDOM(listEl, 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);
  });
</script>
登录后复制

此示例演示以下内容:

  • 将项目添加到列表
  • 从列表中删除项目list
  • 使用 MutationObserver 检测列表中的更改。这可用于执行各种操作,例如修改 UI 或更新后端数据。

以上是JavaScript 如何有效检测并响应 DOM 变化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板