- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题是,比较使用innerHTML 的串联和将文本节点附加到现有节点。幕后发生了什么?
到目前为止我对此的想法:
希望你们能帮我解决这个问题,谢谢!
最佳答案
后者(appendChild
)不会导致 DOM 甚至目标内所有元素/节点的完全重建。
前者(设置innerHTML
)确实会导致目标元素内容的完全重建,如果您要附加,则不需要这样做。
通过 innerHTML += content
附加,使浏览器运行元素中的所有节点,构建 HTML 字符串以提供给 JavaScript 层。然后,您的代码将文本附加到其中并设置 innerHTML
,从而导致浏览器删除目标中的所有旧节点,重新解析所有 HTML,并构建新节点。所以从这个意义上说,它可能效率不高。 (但是,解析 HTML 是浏览器所做的,而且它们的速度真的非常快。)
设置 innerHTML
确实会使您可能持有的目标元素中的任何元素引用无效 - 因为这些元素不再存在,您删除了它们,然后放入了新的元素(看起来非常相似)当您设置 innerHTML
时。
简而言之,如果您追加,我会使用appendChild
(或insertAdjacentHTML
,见下文)。如果您要进行替换,在某些非常有效的情况下,使用 innerHTML
是比通过 DOM API 自己创建树更好的选择(其中速度是首要因素)。
最后,值得一提的是其他几个替代方案:
append
是 DOM 中相对较新的添加(但除了真正过时的浏览器之外还有 excellent support)。它将一项或多项附加到元素,其中项可以是节点、元素或定义节点和元素的 HTML 字符串。与 appendChild
不同,它支持 HTML 字符串和节点,并且还支持多个参数。对于您的用例,它比此列表中的下一个选项更方便:parent.append(htmlString)
。insertAdjacentHTML
将您作为 HTML 字符串提供的节点和元素插入到元素中或元素旁边。您可以使用它附加到元素: theElement.insertAdjacentHTML("beforeend", "the HTML comes here");
第一个参数是放置 HTML 的位置;你的选择是:
"beforebegin"
(在元素之外,就在它的前面)“afterbegin”
(元素内部,开头)“beforeend”
(元素内部,末尾)"afterend"
(在元素之外,就在元素之后)请注意,"afterbegin"
和 "beforeend"
插入元素本身,而 "beforebegin"
和 "afterend"
> 插入到元素的父元素中。浏览器支持是 basically universal .insertAdjacentText
就像 insertAdjacentHTML
一样,只不过它插入一个文本节点(文本不被视为 HTML)。浏览器支持是 basically universal .关于javascript - "innerHTML += ..."与 "appendChild(txtNode)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44223026/
问题是,比较使用innerHTML 的串联和将文本节点附加到现有节点。幕后发生了什么? 到目前为止我对此的想法: 我猜两者都会造成“回流”。 据我所知,后者(附加文本节点)也会导致 DOM 的完全重建
问题是,比较使用 innerHTML 的连接和将文本节点附加到现有节点。幕后发生了什么? 到目前为止我对此的看法: 我猜两者都会导致“回流”。 据我所知,后者(附加文本节点)也会导致 DOM 的完全重
我是一名优秀的程序员,十分优秀!