You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MutationRecord的addedNodes与removedNodes属性是动态还是静态NodeList?

MutationRecord的addedNodes/removedNodes:静态还是动态NodeList?

结论

MutationRecord.addedNodes 和 MutationRecord.removedNodes 返回的是静态(static)NodeList——它们是DOM突变发生时刻的节点快照,后续DOM变化不会影响其内容或长度。此外,确实没有直接判断NodeList是动态还是静态的内置属性,只能通过行为验证。

验证代码示例

验证addedNodes的静态特性

// 创建观察目标并加入页面
const target = document.createElement('div');
document.body.appendChild(target);

const observer = new MutationObserver((records) => {
  const addedNodes = records[0].addedNodes;
  const initialLen = addedNodes.length;
  console.log('初始addedNodes长度:', initialLen); // 输出1

  // 删除刚添加的节点,修改原DOM
  target.removeChild(addedNodes[0]);
  // 检查静态NodeList是否受影响
  console.log('修改后addedNodes长度:', addedNodes.length); // 仍输出1,证明是静态

  observer.disconnect();
});

// 配置观察子节点变化
observer.observe(target, { childList: true });

// 触发添加节点的突变
target.appendChild(document.createElement('p'));

验证removedNodes的静态特性

// 初始化目标节点和子节点
const target = document.createElement('div');
const child = document.createElement('p');
target.appendChild(child);
document.body.appendChild(target);

const observer = new MutationObserver((records) => {
  const removedNodes = records[0].removedNodes;
  const initialLen = removedNodes.length;
  console.log('初始removedNodes长度:', initialLen); // 输出1

  // 将移除的节点重新加回原目标,修改DOM
  target.appendChild(removedNodes[0]);
  // 检查静态NodeList是否受影响
  console.log('修改后removedNodes长度:', removedNodes.length); // 仍输出1,证明是静态

  observer.disconnect();
});

// 配置观察子节点变化
observer.observe(target, { childList: true });

// 触发删除节点的突变
target.removeChild(child);

验证逻辑

动态NodeList(比如element.childNodes)会实时同步DOM的变化,而静态NodeList是固定快照。上面的代码通过修改原DOM后,对比NodeList的长度是否变化,就能判断其类型:如果长度不变,说明是静态快照;如果长度随DOM变化,则是动态NodeList。

内容的提问来源于stack exchange,提问作者yg-i

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:40:11