在 JavaScript 中删除 DOM 节点的所有子元素 [英] Remove all child elements of a DOM node in JavaScript
问题描述
我将如何在 JavaScript 中移除 DOM 节点的所有子元素?
假设我有以下(丑陋的)HTML:
<span>你好</span><div>世界</div></p>
然后我像这样抓取我想要的节点:
var myNode = document.getElementById("foo");
我怎样才能删除 foo
的孩子,以便只剩下 <p id="foo"></p>
?
我可以这样做吗:
myNode.childNodes = new Array();
还是我应该使用 removeElement
的某种组合?
我希望答案是直接的 DOM;如果您还提供 jQuery 中的答案以及仅 DOM 的答案,则可以加分.
Option 1 A: Clearing innerHTML
.
- 这种方法很简单,但可能不适合高性能应用程序,因为它会调用浏览器的 HTML 解析器(尽管浏览器可能针对值为空字符串的情况进行了优化).
doFoo.onclick = () =>{const myNode = document.getElementById("foo");myNode.innerHTML = '';}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;"><span>你好</span>
<button id='doFoo'>通过innerHTML删除</button>
选项 1 B:清除 textContent
- 同上,但使用
.textContent
.根据 MDN 这将比更快innerHTML
因为浏览器不会调用它们的 HTML 解析器,而是会立即用一个#text
节点替换元素的所有子元素.
doFoo.onclick = () =>{const myNode = document.getElementById("foo");myNode.textContent = '';}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;"><span>你好</span>
<button id='doFoo'>通过 textContent 删除</button>
选项 2 A:循环删除每个 lastChild
:
- 对此答案的较早编辑使用了
firstChild
,但已更新为在计算机科学中使用lastChild
,一般来说,它是删除集合的最后一个元素比删除第一个元素要快得多(取决于集合的实现方式). - 循环继续检查
firstChild
以防万一检查firstChild
比检查lastChild
(例如,如果元素列表由 UA 实现为有向链表).
doFoo.onclick = () =>{const myNode = document.getElementById("foo");而(myNode.firstChild){myNode.removeChild(myNode.lastChild);}}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;"><span>你好</span>
<button id='doFoo'>通过lastChild-loop删除</button>
选项 2 B:循环删除每个 lastElementChild
:
- 这种方法保留了所有非
Element
(即#text
节点和)子节点父级(但不是其后代)- 这在您的应用程序中可能是可取的(例如,某些使用内联 HTML 注释来存储模板指令的模板系统).
- 这种方法直到最近几年才被使用,因为 Internet Explorer 仅在 IE9 中添加了对
lastElementChild
的支持.
doFoo.onclick = () =>{const myNode = document.getElementById("foo");而 (myNode.lastElementChild) {myNode.removeChild(myNode.lastElementChild);}}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;"><!-- 此评论不会被删除--><span>您好<!-- 此评论将被删除--></span><!-- 但这个不会.-->
<button id='doFoo'>通过lastElementChild-loop删除</button>