- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题是,比较使用 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 goes 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/2305654/
从逻辑上讲,我想在 div 的链接中嵌入图像。我已经使用链接或图像成功完成了此操作。为了我的目的,我什至并行地使用了链接和图像(这是无用的)。但似乎无法将图像包裹在 div 内的链接中。 var di
我需要将特殊的 iconfont 子节点插入到基础文档中。 我需要的字符序列是“fT”,我将它包裹在一个跨度中,为它提供我想要的字体的颜色和大小。 问题是我附加此“注释”子项的基本文档的父节点有时可能
我正在学习 appendChild 并且到目前为止想出了这段代码: var blah = "Blah!"; var t = document.createElement("table"), tb
我想通过同一页面上的按钮和事件处理程序将相同的内容重复附加到元素。 我遇到的问题是它只在第一次有效。它第一次做的正是我想要的,然后在随后的按钮按下时什么也做不了。我查了一下,似乎在第一次追加之后,“n
我正在尝试在 JavaScript 中创建一个元素并按类名将其应用于所有元素。对于这个例子,我将使用一个段落来方便。然而,通过 JavaScript 创建元素的目的是因为我想稍后在我的代码中创建一个不
我正在尝试输入一个问题,并将该问题显示为表单“调查表单”中的一个元素。但是,当我使用 JavaScript 将子节点附加到“调查表单”时,文本会出现半秒然后消失。似乎标签元素被附加但随后被删除。知道如
请参阅here . 我们有这样的 JavaScript 代码: document.addEventListener("DOMContentLoaded", function(event) { le
所以我尝试向单选按钮输入添加属性,特别是 Javascript 中的名称属性。我将子对象附加到主对象,并且当我使用 Object.setAttribute("name", value); 时然后检查附
我下面有 JS,一旦单击图像下方的图像,我会尝试显示菜单项,一旦单击某个项目,它就会消失。我有多个图像,这就是我构建这个动态内容菜单的原因。我计划在 userMenuContent 中添加一堆 htm
根据文档https://developer.mozilla.org/en-US/docs/DOM/Node.appendChild 、appendChild 将一个节点添加到指定父节点的子节点列表的末
我正在尝试以类似表格的方式打印出所有数组项。我正在创建一个 标题标签,以及 数组中每个元素的标签(与 headers 数组分开)。每当我尝试这样做时,我都会得到预期的结果,但所有数组元素都只是一个长字
有几个问题与同一段代码相关,包括这个:Understanding JavaScript Styling同样,这摘自本书Secrets of the JavaScript Ninja
所以我有一个 div 元素,它将使用 appendChild 方法动态填充其他 div,这应该显示一个列表。用户现在可以使用 JqueryUI Sortable 选项对该列表进行排序。 我还添加了一些
我正在尝试使用超链接将一些 HTML 数据插入 div 标记,单击超链接时会调用 Javascript 函数。 HTML 数据有效,我要显示的项目出现,但执行后立即消失。 我尝试过 event.pre
除了 saved 变量中列出的这些元素之外,以下代码删除特定元素的所有子元素。 let rightCol = document.querySelector("#rightCol"); let save
我的代码是为了添加另一段hello单击“新建”按钮后,在现有的 2 个下。 错误一定是在传递来自onclick 的值时发生的函数或 createTextNode或 appendChild() (不是在
appendChild()函数属于什么对象? 最佳答案 一个 DOM 节点/元素。 interface Node { // NodeType const unsigned short
嘿,我正在尝试 appendChild() 两个连续的 div,但我期望的结果是它们并排放置,但它们像这样一个在另一个之上: 1st div 2nd div 代替第一格第二格 var addBudCo
我正在使用 Google Maps Javascript 创建 map 。我需要对本创建的每个标记进行计数,并将此计数放在一个 DIV 中。scipt 收集计数,但它显示每个标记的计数。例如,如果查询
当我将一个 div 发送到一个为文档片段创建内容的函数时,当我将该片段附加到 div 时,它会向我提供此错误。 Object column_left has no method 'appendChil
我是一名优秀的程序员,十分优秀!