使用MutationObserver检测元素删除

时间:2018-02-19 22:19:28

标签: javascript html dom mutation-observers

我想观察和有时被删除然后重新创建的元素。我的问题是观察者被元素摧毁,并且没有用元素重新创建,我无法检测何时发生这种情况以重新创建观察者。

MDN说“注意:根据规范,如果目标元素被删除,则垃圾收集器会删除MutationObserver。”

无论如何检测到删除?我正在观察一个元素,我想知道该元素何时被删除。我可以检测它的子节点是否已被删除,但我无法检测它本身是否已被删除。

我注册了所有突变,但删除元素时不会调用回调。

我尝试使用setInterval来检查元素是否消失,但是当元素被删除然后快速重新创建时,这不能很好地工作。

1 个答案:

答案 0 :(得分:0)

删除设置了MutationObserver的元素时,它不会触发。 specification仅允许侦听属性,字符数据和子节点的更改。

因此,解决方案是在未删除的父(或祖先)元素上设置MutationObserver。然后,在回调中,您必须遍历MutationRecords以检查其removedNodes属性是否包含您要查找的元素。

该代码将如下所示:

let mutationObserver = new MutationObserver((mutationList, observer) => {
  for (let mutationRecord of mutationList) {
    if (mutationRecord.removedNodes) {
      for (let removedNode of mutationRecord.removedNodes) {
        if (removedNode.id === 'myElement') {
          ...
          return;
        }
      }
    }
  }
});

处理完删除的元素后,return语句就在那里停止循环遍历其余元素。