在JavaScript中删除DOM节点的所有子元素

我将如何在JavaScript中删除DOM节点的所有子元素?

说我有以下(丑陋的)HTML:

hello

world

我抓住了我想要的节点:

var myNode = document.getElementById("foo");

我如何删除removeElement的子女,只留下

我可以这样做:

myNode.childNodes = new Array();

或者我应该使用removeElement的某些组合?

我希望答案是直接的DOM; 如果您还提供jQuery中的答案以及仅限DOM的答案,那么可以提供额外的分数。

26个解决方案

1244 votes

选项1(慢得多,见下面的评论):

var myNode = document.getElementById("foo");

myNode.innerHTML = '';

选项2(快得多):

var myNode = document.getElementById("foo");

while (myNode.firstChild) {

myNode.removeChild(myNode.firstChild);

}

Gabriel McAdams answered 2019-01-21T02:05:02Z

82 votes

目前接受的答案是关于innerHTML较慢(在IE和Chrome中至少)的错误,正如m93a正确提到的那样。

使用此方法可以大大加快Chrome和FF的速度(这会破坏附加的jquery数据):

var cNode = node.cloneNode(false);

node.parentNode.replaceChild(cNode ,node);

在FF和Chrome的遥远的第二,在IE中最快:

node.innerHTML = '';

InnerHTML不会破坏你的事件处理程序或破坏jquery引用,它也建议在这里作为解决方案:[https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML]

最快的DOM操作方法(仍比前两个慢)是Range删除,但IE9之前不支持范围。

var range = document.createRange();

range.selectNodeContents(node);

range.deleteContents();

提到的其他方法似乎具有可比性,但比innerHTML慢很多,除了异常值,jquery(1.1.1和3.1.1),它比其他任何方法慢得多:

$(node).empty();

证据在这里:

[http://jsperf.com/innerhtml-vs-removechild/167] [http://jsperf.com/innerhtml-vs-removechild/300][https://jsperf.com/remove-all-child-elements-of-a-dom-node-in-javascript](jsperf重启的新url,因为编辑旧的url不起作用)

Jsperf的“per-test-loop”通常被理解为“per-iteration”,只有第一次迭代才有删除的节点,因此结果毫无意义,在发布时,此线程中的测试设置不正确。

npjohns answered 2019-01-21T02:06:16Z

40 votes

var myNode = document.getElementById("foo");

var fc = myNode.firstChild;

while( fc ) {

myNode.removeChild( fc );

fc = myNode.firstChild;

}

如果你有可能有jQuery受影响的后代,那么你必须使用一些方法来清理jQuery数据。

$('#foo').empty();

jQuery DOM方法将确保清除与要删除的元素关联的jQuery的任何数据。

如果您只是使用DOM删除子项的方法,则该数据将保留。

user113716 answered 2019-01-21T02:06:51Z

31 votes

如果你使用jQuery:

$('#foo').empty();

如果你不这样做:

var foo = document.getElementById('foo');

while (foo.firstChild) foo.removeChild(foo.firstChild);

PleaseStand answered 2019-01-21T02:07:18Z

15 votes

最快的...

var removeChilds = function (node) {

var last;

while (last = node.lastChild) node.removeChild(last);

};

感谢Andrey Lushnikov与jsperf.com(酷网站!)的链接。

Gabe Halsmer answered 2019-01-21T02:07:47Z

15 votes

使用现代的Javascript,与remove!

const parent = document.getElementById("foo");

while (parent.firstChild) {

parent.firstChild.remove();

}

这是在ES5中编写节点删除的更新方法。 它是vanilla JS,读起来比以前的版本好多了。

大多数用户应该使用现代浏览器,或者您可以根据需要进行调整。

浏览器支持 - 2018年4月91%

Gibolt answered 2019-01-21T02:08:27Z

9 votes

如果您只想让节点没有子节点,您也可以像这样复制它:

var dupNode = document.getElementById("foo").cloneNode(false);

取决于你想要实现的目标。

DanMan answered 2019-01-21T02:08:56Z

5 votes

element.textContent = '';

它就像innerText,标准除外。 它比removeChild()慢一点,但它更容易使用,如果你没有太多东西要删除,也不会产生很大的性能差异。

bjb568 answered 2019-01-21T02:09:18Z

5 votes

这是另一种方法:

function removeAllChildren(theParent){

// Create the Range object

var rangeObj = new Range();

// Select all of theParent's children

rangeObj.selectNodeContents(theParent);

// Delete everything that is selected

rangeObj.deleteContents();

}

Nathan K answered 2019-01-21T02:09:35Z

4 votes

回应DanMan,Maarten和Matt。 克隆节点,设置文本确实是我的结果中可行的方法。

// @param {node} node

// @return {node} empty node

function removeAllChildrenFromNode (node) {

var shell;

// do not copy the contents

shell = node.cloneNode(false);

if (node.parentNode) {

node.parentNode.replaceChild(shell, node);

}

return shell;

}

// use as such

var myNode = document.getElementById('foo');

myNode = removeAllChildrenFromNode( myNode );

这也适用于不在dom中的节点,当尝试访问parentNode时返回null。 此外,如果您需要保证安全,节点在添加内容之前是空的,这非常有用。 考虑下面的用例。

// @param {node} node

// @param {string|html} content

// @return {node} node with content only

function refreshContent (node, content) {

var shell;

// do not copy the contents

shell = node.cloneNode(false);

// use innerHTML or you preffered method

// depending on what you need

shell.innerHTML( content );

if (node.parentNode) {

node.parentNode.replaceChild(shell, node);

}

return shell;

}

// use as such

var myNode = document.getElementById('foo');

myNode = refreshContent( myNode );

我发现这个方法在替换元素内部的字符串时非常有用,如果你不确定节点将包含什么,而不是担心如何清理混乱,那就开始新鲜了。

jeroen answered 2019-01-21T02:10:10Z

3 votes

有几种方法可以实现这一目标:

最快的 ():

while (node.lastChild) {

node.removeChild(node.lastChild);

}

替代方案(较慢):

while (node.firstChild) {

node.removeChild(node.firstChild);

}

while (node.hasChildNodes()) {

node.removeChild(node.lastChild);

}

使用建议的选项进行基准测试

magiccrafter answered 2019-01-21T02:10:50Z

3 votes

我看到有人这样做:

while (el.firstNode) {

el.removeChild(el.firstNode);

}

然后有人说使用el.lastNode更快

但我认为这是最快的:

var children = el.childNodes;

for (var i=children.length - 1; i>-1; i--) {

el.removeNode(children[i]);

}

你怎么看?

PS:这个话题对我来说是一个救生员。 我的firefox插件被拒绝了因为我使用了innerHTML。 这是一个习惯很长一段时间。 然后我发现了这个。 我实际上注意到速度差异。 在加载时,innerhtml需要一段时间来更新,但是它会立即通过addElement进行更新!

Noitidart answered 2019-01-21T02:11:39Z

3 votes

var empty_element = function (element) {

var node = element;

while (element.hasChildNodes()) { // selected elem has children

if (node.hasChildNodes()) { // current node has children

node = node.lastChild; // set current node to child

}

else { // last child found

console.log(node.nodeName);

node = node.parentNode; // set node to parent

node.removeChild(node.lastChild); // remove last node

}

}

}

这将删除元素中的所有节点。

Henrik answered 2019-01-21T02:12:00Z

2 votes

innerText是赢家! [http://jsperf.com/innerhtml-vs-removechild/133。]在所有先前的测试中,父节点的内部dom在第一次迭代时被删除,然后是innerHTML或removeChild,其中应用于空div。

Alexey answered 2019-01-21T02:12:23Z

2 votes

通过Javascript删除节点的子节点的最简单方法

var myNode = document.getElementById("foo");

while(myNode.hasChildNodes())

{

myNode.removeChild(myNode.lastChild);

}

Chaitanya Bapat answered 2019-01-21T02:12:44Z

1 votes

通常,JavaScript使用数组来引用DOM节点列表。 因此,如果您有兴趣通过HTMLElements数组执行此操作,这将很有效。 此外,值得注意的是,因为我使用数组引用而不是JavaScript proto,这应该适用于任何浏览器,包括IE。

while(nodeArray.length !== 0) {

nodeArray[0].parentNode.removeChild(nodeArray[0]);

}

r00t hkr answered 2019-01-21T02:13:07Z

0 votes

为什么我们不遵循这里最简单的方法“删除”循环内部。

const foo = document.querySelector(".foo");

while (foo.firstChild) {

foo.firstChild.remove();

}

选择父div

在While循环中使用“remove”方法来消除第一个子元素,直到没有剩下。

NEelansh VErma answered 2019-01-21T02:13:41Z

0 votes

这是我通常做的事情:

HTMLElement.prototype.empty = function() {

while (this.firstChild) {

this.removeChild(this.firstChild);

}

}

瞧,以后你可以用以下方法清空任何dom元素:

anyDom.empty()

Ado Ren answered 2019-01-21T02:14:09Z

-1 votes

jQuery中的其他方法

var foo = $("#foo");

foo.children().remove();

or

$("*", foo ).remove();

or

foo.html("");

Anoop answered 2019-01-21T02:14:31Z

-1 votes

只是IE:

parentElement.removeNode(true);

true - 深度去除的方法 - 这意味着所有孩子也被移除

user2656596 answered 2019-01-21T02:14:59Z

-1 votes

最简单的方法:

let container = document.getElementById("containerId");

container.innerHTML = "";

milosz answered 2019-01-21T02:15:16Z

-1 votes

简单快速的循环使用!!

var myNode = document.getElementById("foo");

for(var i = myNode.childNodes.length - 1; i >= 0; --i) {

myNode.removeChild(myNode.childNodes[i]);

}

这将不适用于标签!

MOHIT KARKAR answered 2019-01-21T02:15:44Z

-1 votes

刚看到有人在另一个问题中提到这个问题,并认为我会添加一个我还没看到的方法:

function clear(el) {

el.parentNode.replaceChild(el.cloneNode(false), el);

}

var myNode = document.getElementById("foo");

clear(myNode);

clear函数使用元素并使用父节点将其自身替换为没有子元素的副本。 如果元素稀疏,但是当元素具有一堆节点时,性能增益得以实现,性能增益不大。

Harry Chilinguerian answered 2019-01-21T02:16:13Z

-3 votes

如果你想把东西放回.firstChild,那么.lastChild可能更好。

我的例子:

function displayHTML(result){

var movieLink = document.createElement("li");

var t = document.createTextNode(result.Title);

movieLink.appendChild(t);

outputDiv.appendChild(movieLink);

}

如果我使用.firstChild或.lastChild方法,则displayHTML()函数不起作用,但.innerHTML方法没有问题。

Bjathr answered 2019-01-21T02:16:48Z

-3 votes

这是一个纯粹的javascript我不使用jQuery但在所有浏览器甚至IE中工作,它很容易理解

Paragraph one

Paragraph two

Paragraph three

let parent_node =document.getElemetById("my_div"); //Div which contains paagraphs

//Let find numbers of child inside the div then remove all

for(var i =0; i < parent_node.childNodes.length; i++) {

//To avoid a problem which may happen if there is no childNodes[i]

try{

if(parent_node.childNodes[i]){

parent_node.removeChild(parent_node.childNodes[i]);

}

}catch(e){

}

}

})

or you may simpli do this which is a quick way to do

document.getElementById("my_button").addEventListener("click",function(){

let parent_node =document.getElemetById("my_div");

parent_node.innerHTML ="";

})

Ir Calif answered 2019-01-21T02:17:10Z

-5 votes

用jQuery:

$("#foo").find("*").remove();

Arnaud F. answered 2019-01-21T02:17:32Z

js操作html节点中怎么删除子节点,在JavaScript中删除DOM节点的所有子元素相关推荐

  1. 【JavaScript】添加DOM节点

    [JavaScript]添加DOM节点 原创刘甜- 最后发布于2019-03-24 19:59:39 阅读数 310  收藏 展开 HTML DOM树 当网页被加载时,浏览器会创建页面的文档对象模型( ...

  2. js判断是否为数字_第23题:JavaScript 中如何判断变量是否为数字 ?

    在JavaScript中,诸如NaN,Infinity(正无穷)和-Infinity(负无穷)之类的特殊值也是数字类型的. 判断方法3中: Number.isFinite() Number.isNaN ...

  3. JavaScript 浅谈DOM节点层次:Text /Coment等类型

    浅谈DOM其他节点层次:Text .Coment. 一.Text类型--文本 Text类型表示纯文本内容,其特性有 nodeType == 3  ;  nodeName == "#text& ...

  4. JavaScript监听DOM节点变化事件

    JS监听页面DOM节点的变化 DOMSubtreeModified DOMNodeInserted DOMNodeRemoved DOMNodeInsertedIntoDocument DOMNode ...

  5. 取出url中的字符_如何在JavaScript中解析URL:例如主机名,路径名,查询,哈希?...

    统一资源定位符(缩写URL)是对Web资源(网页,图像,文件)的引用.URL指定资源位置和检索资源的机制(http,ftp,mailto). 例如,这是此博客文章的URL: 通常,您需要访问URL的特 ...

  6. javascript字典中添加数组_如何在JavaScript中使用数组方法:Mutator方法

    JavaScript中的数组由元素列表组成.JavaScript有许多有用的内置方法来处理数组.修改原始数组的方法称为mutator方法,返回新值或表示的方法称为accessor方法.在本教程中,我们 ...

  7. php中常见的错误类型有,JavaScript中常见的错误类型有哪些?(详细介绍)

    在JavaScript中,当发生错误时会生成描述错误类型的错误对象,此错误对象包含错误类型和编号等信息,这些信息可用于后续处理等,在本篇文章中将给大家介绍常见的错误类型以及如何处理这些错误. Java ...

  8. html中怎么判断数字格式是否,javascript中怎么判断是否是数字?

    JavaScript中判断是否是数字的方法:1.使用isNaN()函数判断.2.使用正则表达式/^[0-9]+.?[0-9]*/可以判断是否是数字.3.使用parseFloat()函数判断是否是数字. ...

  9. PyQt中如何在子部件(child Widget)中调用父部件(parent Widget)中的方法

    如果你也想赚钱,实现财务自由,但接触不到优质的人脉和资源,可以到公June浩:成长home,发"资源" ,就会看到我吐血整理的168条保姆级零基础吸金秘籍,跟着我一起亲历毕业5年. ...

  10. js中every用法_详解JavaScript中的every()方法

    JavaScript 数组中的每个方法测试数组中的所有元素是否经过所提供的函数来实现测试. 语法 array.every(callback[, thisObject]); 下面是参数的详细信息: ca ...

最新文章

  1. 打开 hyper-v 批处理_如何控制批处理服务器
  2. sudo apt-get update后public key is not available公钥不存在问题解决
  3. 笔记-项目立项管理-项目的可行性研究-可行性研究内容
  4. MUI - 解决bug: iphone页面保存时popPicker自动弹出来
  5. java基础:数据类型
  6. python封装sql脚本_flask-sqlalchemy如何使用原生的sql语句然后封装?
  7. 中压变频器行业现状调研及趋势分析报告
  8. 重庆钢铁泛微oa系统服务器更新时间,泛微全新OA系统-协同办公系统
  9. 监控系统 服务器配置,监控系统服务器配置
  10. 搭建一个可视化看板,仅需 4 步
  11. 【程序人生】上海,想说爱你不容易
  12. VMware中建立共享文件夹 win7
  13. 华为nova6开启开发者模式,连接USB
  14. 微信小程序实现运动步数排名与发布个人动态服务器部署
  15. 硬盘连接电脑提示要格式化怎么办?
  16. (一)Siamese目标跟踪——SiamFC训练和跟踪过程:从论文细节角度出发
  17. Assertion断言的使用
  18. 计算机专业素质基础知识,计算机类职业素养培养
  19. 爸爸给4岁女儿的遗书 10年后女儿回了信(感人)
  20. 初学者刚开始如何正确运行pycharm

热门文章

  1. python抢红包 无需电脑_Python助你秒抢红包,拼手速?不存在!
  2. 探秘 Containerd 容器中的 Shim 进程
  3. Vue :将头像/文本生成二维码
  4. 用python爬取微博评论对鹿晗、关晓彤微博进行情感分析
  5. 52个比付费软件更好的免费软件
  6. fi sap 凭证冲销 稅_SAP FI 系列 (019) - 会计凭证的冲销和反记账
  7. 学习python爬虫-爬取豆瓣top250相关信息
  8. 二.LVGL学习——(lv_obj基础对象)
  9. Java初学者日志_05
  10. SwiftUI 动态岛开发教程之 07 Live Activities实时活动的要求和限制