按id删除元素

使用标准JavaScript删除元素时,您必须先转到其父级:

var element = document.getElementById("element-id");element.parentNode.removeChild(element);

必须首先访问父节点对我来说似乎有点奇怪,JavaScript这样工作是有原因的吗?

1773220 次浏览

据我所知,直接删除节点在Firefox中不起作用,只能在Internet Explorer中使用。因此,要支持Firefox,您必须前往父级删除它的子级。

参考:http://chiragrdarji.wordpress.com/2007/03/16/removedelete-element-from-page-using-javascript-working-in-firefoxieopera/

这就是DOM支持的。在该页面搜索“删除”或“删除”,移除子节点是唯一删除节点的页面。

你可以创建一个remove函数,这样你就不必每次都考虑它:

function removeElement(id) {var elem = document.getElementById(id);return elem.parentNode.removeChild(elem);}

这个实际上来自Firefox……这一次,IE领先于包,并允许直接删除元素。

这只是我的假设,但我相信您必须通过父级删除子级的原因是由于Firefox处理引用的方式存在问题。

如果你调用一个对象直接提交hari-kari,那么在它死亡后,你仍然持有对它的引用。这有可能产生几个讨厌的错误…例如未能删除它,删除它但保留对它的引用,看起来有效,或者只是内存泄漏。

我相信当他们意识到这个问题时,解决方法是通过其父级删除一个元素,因为当元素消失时,你现在只需持有对父级的引用。这将停止所有不愉快,并且(例如,如果逐个节点关闭树节点)会'zip-up'相当好。

它应该是一个易于修复的bug,但与Web编程中的许多其他事情一样,发布可能是匆忙的,导致了这一点……当下一个版本出现时,足够多的人正在使用它,改变这将导致破坏一堆代码。

再一次,所有这些都只是我的猜测。

然而,我确实期待着有一天网络编程最终得到全面的春季大扫除,所有这些奇怪的小特质都被清理干净,每个人都开始遵守同样的规则。

可能是在我的机器人仆人起诉我欠薪的第二天。

使用ele.parentNode.removeChild(ele)的函数不适用于您创建但尚未插入HTML的元素。jQueryPrototype等库明智地使用如下方法来规避该限制。

_limbo = document.createElement('div');function deleteElement(ele){_limbo.appendChild(ele);_limbo.removeChild(ele);}

我认为JavaScript是这样工作的,因为DOM的原始设计者将父/子和上一个/下一个导航视为比今天如此流行的DHTML修改更高的优先级。能够根据DOM中的相对位置从一个<input type='text'>读取并写入另一个<input type='text'>在90年代中期很有用,当时整个HTML表单或交互式GUI元素的动态生成在一些开发人员眼中几乎没有闪烁。

这是删除元素而不会出现脚本错误的最佳函数:

function Remove(EId){return(EObj=document.getElementById(EId))?EObj.parentNode.removeChild(EObj):false;}

注意EObj=document.getElementById(EId)

这是一个等号,不是==

如果元素EId存在,则函数将其删除,否则返回false,而不是error

// http://javascript.crockford.com/memory/leak.html// cleans dom element to prevent memory leaksfunction domPurge(d) {var a = d.attributes, i, l, n;if (a) {for (i = a.length - 1; i >= 0; i -= 1) {n = a[i].name;if (typeof d[n] === 'function') {d[n] = null;}}}a = d.childNodes;if (a) {l = a.length;for (i = 0; i < l; i += 1) {domPurge(d.childNodes[i]);}}}
function domRemove(id) {var elem = document.getElementById(id);domPurge(elem);return elem.parentNode.removeChild(elem);}

我知道增强原生DOM函数并不总是最好或最流行的解决方案,但这对于现代浏览器来说效果很好。

Element.prototype.remove = function() {this.parentElement.removeChild(this);}NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {for(var i = this.length - 1; i >= 0; i--) {if(this[i] && this[i].parentElement) {this[i].parentElement.removeChild(this[i]);}}}

然后你可以去掉像这样的元素

document.getElementById("my-element").remove();

document.getElementsByClassName("my-elements").remove();

备注:此解决方案不适用于IE 7及以下版本。有关扩展DOM的更多信息,请阅读此文章

编辑:回顾我在2019年的答案,node.remove()已经来救援了,可以使用如下(没有上面的聚填料):

document.getElementById("my-element").remove();

[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());

这些功能在所有现代浏览器(不是IE)中都可用。阅读更多关于MDN的信息。

跨浏览器和IE>=11:

document.getElementById("element-id").outerHTML = "";

你可以使用element.remove()

删除一个元素:

 var elem = document.getElementById("yourid");elem.parentElement.removeChild(elem);

对于删除所有元素,例如某个类名:

 var list = document.getElementsByClassName("yourclassname");for(var i = list.length - 1; 0 <= i; i--)if(list[i] && list[i].parentElement)list[i].parentElement.removeChild(list[i]);

根据当前正在开发的DOM级别4规范,有一些新的方便的突变方法可用:append()prepend()before()after()replace()remove()

https://catalin.red/removing-an-element-with-plain-javascript-remove-method/

2011年更新

这是添加到DOM规范返回2011年,所以你可以只使用:

element.remove()

DOM被组织在节点树中,其中每个节点都有一个值,以及对其子节点的引用列表。所以element.parentNode.removeChild(element)准确地模拟了内部发生的事情:首先你去父节点,然后删除对子节点的引用。

从DOM4开始,提供了一个辅助函数来做同样的事情:#0。这适用于96%的浏览器(截至2020年),但不是IE 11。

如果您需要支持较旧的浏览器,您可以

必须先去父节点对我来说有点奇怪,有没有为什么JavaScript像这样工作?

恕我直言:这样做的原因与我在其他环境中看到的相同:您正在根据指向某物的“链接”执行操作。当您链接到它时,您不能删除它。

就像砍树一样。砍树时坐在离树最近的一边,否则结果会很不幸(尽管很有趣)。

ChildNode.remove()方法从它所属的树中删除对象。

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

这是一个小提琴,展示了如何调用document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

无需扩展NodeList。它已经实现了。

**

必须首先访问父节点对我来说似乎有点奇怪,JavaScript这样工作是有原因的吗?

函数名称为removeChild(),当没有父函数时,如何删除子函数?:)

另一方面,你并不总是必须像你所展示的那样调用它。element.parentNode只是获取给定节点的父节点的助手。如果你已经知道父节点,你可以像这样使用它:

例如:

// Removing a specified element when knowing its parent nodevar d = document.getElementById("top");var d_nested = document.getElementById("nested");var throwawayNode = d.removeChild(d_nested);

https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild

=========================================================

添加更多内容:

一些答案指出,可以使用elem.remove();而不是parentNode.removeChild(child);。但正如我所注意到的,这两个函数之间存在差异,这些答案中没有提到。

如果您使用removeChild(),它将返回对已删除节点的引用。

var removedChild = element.parentNode.removeChild(element);console.log(removedChild); //will print the removed child.

但是如果你使用elem.remove();,它不会返回引用。

var el = document.getElementById('Example');var removedChild = el.remove(); //undefined

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

这种行为在Chrome和FF中都可以观察到,值得注意:)

希望我的回答对问题有帮助!!

您可以使用DOM的remove()方法直接删除该元素。

这里有一个例子:

let subsWrapper = document.getElementById("element_id");subsWrapper.remove();//OR directly.document.getElementById("element_id").remove();

最短

我改进了Sai Sunder回答,因为OP使用允许避免getElementById的ID:

elementId.remove();

box2.remove();          // remove BOX 2
this["box-3"].remove(); // remove BOX 3 (for Id with 'minus' character)
<div id="box1">My BOX 1</div><div id="box2">My BOX 2</div><div id="box-3">My BOX 3</div><div id="box4">My BOX 4</div>

您可以简单地使用

document.getElementById("elementID").outerHTML="";

它适用于所有浏览器,甚至在Internet Explorer上。