按 id 删除元素

Remove element by id

提问人:Zaz 提问时间:8/2/2010 最后编辑:Kamil KiełczewskiZaz 更新时间:7/2/2022 访问量:1839115

问:

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

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

必须先去父节点对我来说似乎有点奇怪,JavaScript 有这样的工作方式吗?

JavaScript DOM

评论

581赞 Mark Henderson 8/2/2010
正如 James 所说,DOM 不支持直接删除对象。您必须转到其父级并从那里将其删除。Javascript 不会让一个元素自杀,但它确实允许杀婴......
22赞 kizzx2 1/9/2012
有原因吗?理查德·费曼说不。(好吧,如果你编写过任何树结构程序,技术理由很容易看出。无论如何,孩子必须通知父母,否则树结构可能会被破坏。由于它无论如何都必须在内部执行,如果它为您提供了一行函数,那么它对您来说只是一个方便的功能,您不妨自己定义一下。
6赞 Alex K 10/16/2012
我看到的唯一原因是 xml/xhtml 文档中应该始终有一个根元素,因此您将无法删除它,因为它没有父元素
5赞 Zaz 8/12/2013
我非常喜欢 Johan 的解决方法,但我不确定为什么这些函数不是原生提供的。从观众的数量可以看出,这是一个非常常见的操作。
23赞 Gibolt 8/13/2017
从 ES5 开始,您可以直接使用。你不需要父母!element.remove()

答:

2赞 James 8/2/2010 #1

据我了解,直接删除节点在Firefox中不起作用,只能在Internet Explorer中工作。因此,要支持Firefox,您必须转到父级以删除其子级。

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

评论

7赞 Zaz 8/2/2010
这并不能真正回答我的问题,您链接到的页面提供了比我更糟糕的解决方案。
98赞 Andrew 8/2/2010 #2

这就是 DOM 所支持的。在该页面中搜索“remove”或“delete”,removeChild 是唯一删除节点的页面。

评论

14赞 Zaz 8/17/2010
这回答了我最初的问题,但为什么 JavaScript 会这样工作?
5赞 Chadams 5/3/2013
我只是在这里猜测,但我认为它与内存管理有关。父节点很可能包含指向子节点的指针列表。如果只是删除了一个节点(不使用父节点),则父节点仍将保留指针并导致内存泄漏。因此,API 会强制您在父级上调用函数来删除子级。这也很好,因为它可以引导树向下遍历子节点,在每个子节点上调用 remove,而不会泄漏内存。
3赞 Muhammad Umer 7/10/2013
嘿,伙计们,即使那个参考资料没有这个,我还是偶然发现的。写作会起作用。也许这是新的东西。但对我来说是第一次,它有效。我认为它应该一直有效,因为它是非常基本的,必须有东西。element.remove();
1赞 fanfan1609 2/13/2014
但它在 IE7 及以下版本中不起作用。在 IE7 及更低版本中,remove() 不起作用
1赞 PhilT 2/17/2015
如果我不得不猜测,它这样工作的原因是 DOM 元素无法自行删除。你正在从它的脚下移除众所周知的地毯。您必须将其从容器中移除。至少我是这么想的。
196赞 xsznix 8/3/2010 #3

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

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

评论

12赞 twiz 12/27/2012
如果您想要单行而不全局,则可以更改为 。这样,函数就会引用自身,因此您不必创建另一个全局变量。:-)elemremove.elem
6赞 Zach Lysobey 4/13/2013
那么,为什么需要退回ELEM?为什么不呢function remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
5赞 Wk_of_Angmar 7/2/2013
@ZachL:虽然你的解决方案可能看起来更明显,但它执行了两个DOM查找,这速度较慢,而且其他解决方案似乎想要避免这种情况。
4赞 Mitch Match 1/22/2016
不起作用。错误太多。这有效: var elem = document.getElementById('id') ;elem.parentNode.removeChild(elem);
2赞 David Fariña 9/29/2016
哇,为什么这么复杂。只需将元素本身传递给函数而不是 id 字符串即可。这样,该元素就可以在整个功能中访问,并且它保持一个行
2赞 SilentThunderStorm 8/19/2011 #4

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

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

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

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

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

同样,所有这些都只是我的猜测。

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

大概是我的机器人仆人起诉我拖欠工资的第二天。

评论

11赞 Felix Kling 8/24/2011
我怀疑Firefox对此负责。 是 DOM Level 1 Node 接口的方法。removeChild
8赞 Psudo 12/19/2011 #5

使用 的函数不适用于已创建但尚未插入到 .图书馆喜欢并明智地使用如下方法来规避这种限制。ele.parentNode.removeChild(ele)HTMLjQueryPrototype

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

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

-2赞 Amin Atabakzadeh 5/17/2012 #6

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

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

请注意。EObj=document.getElementById(EId)

这是一个等号,不是 .==

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

评论

4赞 bjb568 5/17/2014
创建全局变量。
1赞 Emile Bergeron 10/31/2016
这也是另一个答案的最差版本,但晚了 2 年。
1赞 will Farrell 10/3/2012 #7
// http://javascript.crockford.com/memory/leak.html
// cleans dom element to prevent memory leaks
function 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);
}
760赞 Johan Dettmar 8/8/2013 #8

我知道增强原生 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 年的答案,已经到了救援,可以按如下方式使用(没有上面的 polyfill):node.remove()

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

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

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

评论

0赞 Aureliano Far Suau 9/3/2015
怎么样?while(this.length){ this[0].parentElement.removeChild(this[0]); }
0赞 Johan Dettmar 9/28/2015
@AurelianoFarSuau,这可能也可以工作(我自己没有测试过)。但是,此循环每次都会读取长度值,这可能会稍慢一些。此外,据我所知,您需要确保当前元素仍然存在并且具有父元素,否则您可能会为嵌套元素等引发错误。if(this[i] && this[i].parentElement)
1赞 Hal50000 11/2/2016
别这样。只需按照语言的意图删除项目即可。任何熟悉解析 XML 的人都会认识到需要找到父级来删除子级。HTML 是 XML 的超集(某种程度上)。
0赞 Wachaga Mwaura 12/13/2017
在使用像 DHTMLX 套件这样的框架时特别有用,特别是当您在选项卡栏中有多个具有相同名称和 ID 的表单并且您正在尝试实现 AJAX 时。将其粘贴到每个表单的顶部,以取消以前加载的表单,以便当前表单是唯一加载的表单。多谢!
330赞 user2192293 10/10/2013 #9

跨浏览器和 IE >= 11:

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

评论

3赞 dgo 5/2/2014
这似乎是最简单、最可靠、最快的解决方案。我不需要删除元素,所以我跳过最后一行,但这不应该增加任何开销。注意:我在尝试寻找比 js 更快的标签替代品时发现了这一点。为了按照我想要的方式使用它,我不得不将其包装在一个 1ms 函数中。这立即解决了我所有的问题。谢谢。$.readynoscriptsetTimeout
0赞 Super Cat 8/11/2016
请记住,它仍然是标准的一个新(呃)补充。如果您在撰写本文时正在寻找任何软件 >6 的支持,您将需要另一种解决方案。其他人提到的功能也是类似的情况。像往常一样,实现 polyfill 是安全的。outerHTMLremove
0赞 Ivan Kleshnin 11/23/2017
delete element什么都不做,因为你不能删除JS中的变量,只有键;)自己检查一下,它不起作用......console.log(element)delete element
2赞 Alejandro García Iglesias 6/24/2019
这比(在我的系统上大约 6-7%)慢一点。查看 jsperf.com/clear-outerhtml-v-removechild/2removeChild
1赞 lacostenycoder 3/14/2020
这可能会留下一个空间,如果这是您尝试删除的空间,则 iframe 曾经所在的空间。
28赞 Sai Sunder 3/1/2014 #10

你可以只使用element.remove()

评论

4赞 Tim Nguyen 6/13/2014
Josh,它是有效的 javascript,除了只有 Firefox 和 Chrome 实现了它(参见 MDN)
11赞 Zaz 7/10/2014
我的坏,element.remove() 带有 DOM4 的有效 JavaScript,并且适用于所有现代浏览器,自然除了 Internet Explorer。
0赞 Rani Kheir 5/28/2016
根据 MDN 的 ChildNode.remove() 页面,Edge 也支持它。
1赞 aboutaaron 7/25/2017
MDN 还为 IE 支持提供了 polyfill developer.mozilla.org/en-US/docs/Web/API/ChildNode/...
38赞 csjpeter 8/5/2014 #11

要删除一个元素:

 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]);

评论

0赞 KyleMit 8/5/2014
现有答案很好地涵盖了这一点。
0赞 Hydrothermal 10/21/2014
为什么需要这条线?难道每个元素的存在不是由方法返回的事实来保证的吗?if(list[i] && list[i].parentElement)getElementsByClassName
0赞 csjpeter 10/23/2014
不幸的是,据我所知,它的存在并不能得到真正的保证,但我不知道它的细节。我刚刚经历了一次奇怪的未定义或空值,我将该检查放在那里而没有进一步调查。所以这有点黑客。
0赞 Worker 3/19/2015
它应该是document.getElementsByClassName(...
0赞 csjpeter 3/19/2015
真的,它应该代替.谢谢。ElementsElement
12赞 Red 8/8/2014 #12

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

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

137赞 Zaz 12/31/2014 #13

2011 年更新

这在 2011 年被添加到 DOM 规范中,因此您可以使用:

element.remove()

DOM 组织在节点树中,其中每个节点都有一个值,以及对其子节点的引用列表。因此,它完全模拟了内部发生的情况:首先转到父节点,然后删除对子节点的引用。element.parentNode.removeChild(element)

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

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

评论

8赞 Emile Bergeron 3/7/2018
请不要“修改原生 DOM 函数”。
3赞 TheSatinKnight 5/12/2017 #14

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

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

就像砍树枝一样。切割时坐在最靠近树的一侧,否则结果将是......不幸(虽然很有趣)。

20赞 Alex Fallenstedt 7/29/2017 #15

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

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

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

https://jsfiddle.net/52kp584L/

**

无需扩展 NodeList。它已经实施。

**

评论

2赞 MacroMan 6/29/2018
请注意,任何版本的 IE 都不支持此功能!
8赞 Nimeshka Srimal 8/20/2018 #16

必须先去父节点对我来说似乎有点奇怪,JavaScript 有这样的工作方式吗?

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

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

前任:

// Removing a specified element when knowing its parent node
var 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

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

要添加更多内容,请执行以下操作:

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

如果使用 ,它将返回对已删除节点的引用。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 中观察到此行为。我相信值得注意:)

希望我的回答能为问题增加一些价值,并会有所帮助!

21赞 Code Cooker 10/3/2019 #17

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

下面是一个示例:

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();
7赞 Kamil Kiełczewski 6/12/2020 #18

最短

我改进了 Sai Sunder 的答案,因为 OP 使用 ID 可以避免 getElementById:

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>

9赞 KHAYRI R.R. WOULFE 10/17/2020 #19

您可以简单地使用

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

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