【发布时间】:2021-01-05 23:00:01
【问题描述】:
我有一个正在添加到 DOM 的节点是某个未知的地方。我不知道父母会是什么,我唯一能做的假设是它会在document.body的子树中。
此外,我不能假设节点将作为自身添加;当它进入 DOM 时,它可能会隐藏在某个其他元素的子树中。
我希望在元素从 DOM 中删除和添加时发生回调。
我尝试使用Mutation Observer,但它不适合这项工作。 Mutation Observers 不能观察特定元素,而是观察一个元素的子元素。鉴于我不知道父元素是什么,我无法观察父元素是否添加了这个特定的子元素。
到目前为止,我能找到的唯一解决方案是在 整个 DOM 上使用突变观察者,从 document.body 开始,带有子树,然后遍历每个子树的整个子树添加节点搜索我正在寻找的一个节点。
我拥有的下一个最佳解决方案是在任何时候添加或删除 anything 时检查我试图观察的每个节点是否在页面上。这个最大的问题是它需要持有对可能被弃用的 HTMLELements 的引用,并且最终会阻塞垃圾收集器。
这些方法都不是有效的。
当然,一定有更好的方法吗?这不会是一个那么难的问题吧?
function onElementAdd(node, cb);
function onElementRemove(node, cb);
【问题讨论】:
-
哇。显然我 4 年前问过同样的问题:stackoverflow.com/questions/40364156/…
-
Mutationobservers 看起来正是你所要求的,因为你观察了 document.body 的子树。你收到的突变记录不是包含所有必需的信息吗?
-
您必须遍历每个添加元素的整个子树来搜索一个。效率低得离谱。
-
不,你有 MutationRecord.addedNodes/removedNodes,见developer.mozilla.org/en-US/docs/Web/API/MutationRecord
-
您可以扩展一个通用的
div,它可以让您访问这些回调。了解这些回调的来源很有趣,因为您甚至可以在其中执行super.connectedCallback()。我想这些只有在扩展时才会暴露。
标签: javascript mutation-observers