为什么 DOMSubtreeModified 事件在 DOM 级别 3 中被弃用?

IT技术 javascript dom javascript-events deprecated dom3
2021-01-25 04:16:36

为什么不推荐使用DOMSubtreeModified 事件,我们应该改用什么?

2个回答

如果你向下滚动一点,你会看到:

警告!MutationEvent接口是在 DOM Level 2 Events 中引入的,但尚未在用户代理之间完全且互操作地实现。此外,也有人批评界面的设计带来了性能和实现方面的挑战。一个新的规范正在开发中,旨在解决突变事件解决的用例,但以更高效的方式。因此,本规范描述了变异事件以供参考和遗留行为的完整性,但不赞成使用MutationEvent接口和MutationNameEvent 接口。

替代 API 是突变观察者,它在 DOM 生活标准中完全指定,取代了所有 DOM 级别 X 愚蠢。

@ TJ - 没有下来。上面的一个是DOMNodeRemovedFromDocument:-)
2021-03-19 04:16:36
animationStart 的问题是,它只适用于插入节点。不适用于节点移除、属性编辑或文本更改。它也是单节点,DOMSubtreeModified允许从根节点观察整棵树。
2021-03-31 04:16:36
替换将在 DOM Level 4 dvcs.w3.org/hg/domcore/raw-file/tip /... 看起来 Chromium bugs.webkit.org/show_bug.cgi?id=73851有一些进展
2021-04-09 04:16:36
替换MutationEvent界面的一个很好的技巧animationStart和一些 CSS
2021-04-10 04:16:36

我认为替代者将是突变观察者:https : //developer.mozilla.org/en-US/docs/Web/API/MutationObserver

var whatToObserve = {childList: true, attributes: true, subtree: true, attributeOldValue: true, attributeFilter: ['class', 'style']};
var mutationObserver = new MutationObserver(function(mutationRecords) {
  $.each(mutationRecords, function(index, mutationRecord) {
    if (mutationRecord.type === 'childList') {
      if (mutationRecord.addedNodes.length > 0) {
        //DOM node added, do something
      }
      else if (mutationRecord.removedNodes.length > 0) {
        //DOM node removed, do something
      }
    }
    else if (mutationRecord.type === 'attributes') {
      if (mutationRecord.attributeName === 'class') {
        //class changed, do something
      }
    }
  });
});
mutationObserver.observe(document.body, whatToObserve);