javascript - 为什么 DocumentFragment 会忽略一些附加节点?

标签 javascript html dom

我正在尝试执行这段代码,但得到的结果是 first third , 完全忽略中间 <b>second</b>节点。谁能告诉我问题出在哪里?

const html = 'first <b>second</b> third ';
const span = document.createElement('span');
const frag = document.createDocumentFragment();
span.innerHTML = html;

for (let node of span.childNodes) {
	frag.appendChild(node);
}

document.body.appendChild(frag);

最佳答案

这是因为您正在改变您正在遍历的节点列表。每次从 span 中删除一个节点(通过将其附加到片段),.childNodes 都会更新并重新编制索引。

由于您要传输所有节点,因此请使用 while 循环,只要至少有一个子节点就会运行,并将 .firstChild 附加到片段中。

const html = 'first <b>second</b> third ';
const span = document.createElement('span');
const frag = document.createDocumentFragment();
span.innerHTML = html;

while (span.firstChild) {
  frag.appendChild(span.firstChild);
}

document.body.appendChild(frag);


或者只使用 .insertAdjacentHTML()而不是所有这些转移。

const html = 'first <b>second</b> third ';

document.body.insertAdjacentHTML("beforeend", html);

关于javascript - 为什么 DocumentFragment 会忽略一些附加节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043426/

相关文章:

javascript - Moment js 时间选择器

javascript - 无法在函数中设置状态

javascript - 如何编写 js 代码,以最少的跳转次数以较低的时间复杂度到达目标

javascript - 使用 html 按钮而不是使用 Mapbox GL JS 的链接切换 GeoJSON 图层

javascript - 在 javascript 中替换 HTML5 视频 src 字符串不会替换视频

javascript - 通过 innerHTML 动态添加的 CSS 文件加载结束的事件

html - 我的左侧菜单和子菜单在低带宽情况下覆盖了我的整个页面

javascript - 类似于 CSS "float:right",但无法选择

javascript - 在 JavaScript 中添加和删除属性

Angular:从组件中的 ngFor 循环获取新的 DOM 元素