当前位置: 首页 > 面试题库 >

“ innerHTML + =…”与“ appendChild(txtNode)”

巫研
2023-03-14
问题内容

问题是,比较使用innerHTML的隐含条件并将文本节点附加到现有节点。幕后发生了什么?

到目前为止,我对此的想法是:

  • 我猜都是在引起“ ReFlow”。
  • 据我所知,后者(附加一个文本节点)也会导致DOM的完全重建(正确?他们都在这样做吗?)。
  • 前者似乎还有其他讨厌的副作用,例如导致先前保存的对子节点的引用指向我正在修改innerHTML的节点,不再指向“当前DOM” /“子节点的正确版本”。相反,在附加子代时,引用似乎保持不变。为什么是这样?

希望大家能帮我解决这个问题,谢谢!


问题答案:

后者(appendChild)不 使DOM的完整重建或甚至所有目标内的元件/节点。

前者(设置innerHTML)的确会完全重建目标元素的内容,如果要附加,则不需要重新构建。

附加通过innerHTML += content可使浏览器遍历元素中的所有节点,从而构建HTML字符串以提供给JavaScript层。然后,您的代码将文本附加到其上并进行设置innerHTML,导致浏览器将所有旧节点拖放到目标中,重新解析所有HTML,并构建新节点。因此从这个意义上讲,它可能不是有效的。(但是,解析HTML是
浏览器的工作, 而且 浏览 速度非常快。)

设置innerHTML确实会使您可能拥有的目标元素中对元素的任何引用无效-
因为这些元素已不存在,因此在设置时删除了它们,然后放入了新元素(看起来很相似)innerHTML

简而言之,如果您要 追加
,我会使用appendChild(或insertAdjacentHTML,请参见下文)。如果要替换,则在非常有效的情况下,使用innerHTML方法比通过DOM
API自己创建树更好(在这些方法中,速度是首要的)。

最后,值得一提的是insertAdjacentHTML,该函数可用于使用HTML字符串将节点和元素插入到元素中或元素旁边。您可以将其附加到元素上:theElement.insertAdjacentHTML("beforeend", "the HTML goes here");第一个参数是放置HTML的位置;第二个参数是放置HTML的位置。您的选择是"beforebegin"(元素外部,在元素前面),"afterbegin"(元素内部,在开头),"beforeend"(元素内部,在结尾)和"afterend"(元素外部,在元素之后)。请注意,"afterbegin""beforeend"插入到元素本身,而"beforebegin""afterend"插入到元素的
。我不知道所有主流桌面浏览器都支持该设备有多么出色的移动支持(尽管我确信至少iOS Safari和Android
2.x及更高版本具有此功能),但是垫片很小。



 类似资料:
  • 问题内容: 我正在尝试向div添加ajax响应(它是带有表,表单等的HTML代码)。 在FF中工作完美,但在IE中却给了我一个未知的错误。 我尝试了很多东西,但是只有当我添加jQuery并在要插入代码的div上运行该方法时,它才起作用。 有人在乎解释为什么这样做有效,而不是简单吗?我尝试查看代码,但我想我不是JS的佼佼者,因为我不了解它在做什么。 问题答案: IE 有 多个 文档(pre | ta

  • 本文向大家介绍innerHTML与outerHTML有什么区别?相关面试题,主要包含被问及innerHTML与outerHTML有什么区别?时的应答技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍js利用appendChild对 标签进行排序的实现方法,包括了js利用appendChild对 标签进行排序的实现方法的使用技巧和注意事项,需要的朋友参考一下 按照从大到小排序 appendChild: 假设父级a中已经有子节点b,那么a.appendChild(b)的作用是:1.先将子节点b从父级a中删除;2.再将子节点b添加到a中,放在最末尾。 以上就是小编为大家带来的js利用

  • 问题内容: 当您想使用Javascript更改HTML时,如何知道何时使用以下任一方法? 问题答案: 设置通常用于输入/表单元素。通常用于div,span,td和类似元素。

  • 问题内容: 与在元素上设置元素的innerHTML与在元素上设置危险地设置InnerHTML属性有什么“幕后”区别?假设为简单起见,我正在对事物进行适当的消毒。 例: 与 我做的事情比上面的示例复杂一些,但总体思路是相同的 问题答案: 是,有一点不同! 使用vs 的直接效果是相同的-DOM节点将使用注入的HTML更新。 但是 ,在使用它时,让React 在幕后知道该组件内部的HTML并不是它关心的

  • 问题内容: 我正在使用lxml.html解析网页的脚本。我当时做了很多的BeautifulSoup,但是由于速度快,现在正在尝试使用lxml。 我想知道该库中最明智的方法是执行与Javascript InnerHtml等效的操作,即检索或设置标签的完整内容。 因此,InnerHtml为: 我可以使用黑客(转换为字符串/正则表达式等)来完成此操作,但是我假设有一种正确的方法可以使用由于不熟悉而丢失的