通过 id 删除元素

IT技术 javascript dom
2021-01-10 04:35:20

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

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

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

6个回答

我知道增强原生 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()已经解决了,可以按如下方式使用(没有上面的 polyfill):

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

或者

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

这些功能在所有现代浏览器(非 IE)中都可用。MDN上阅读更多内容

@slicedtoad 你是对的,我的错。我修改了函数以在元素中向后循环。似乎工作正常。您所谈论的行为很可能是由更新的索引引起的。
2021-03-12 04:35:20
不要这样做。只需按照语言预期的方式删除项目。任何熟悉解析 XML 的人都会认识到需要联系父级来删除子级。HTML 是 XML 的超集(有点)。
2021-03-17 04:35:20
不应该是 [ document.getElementsByClassName("my-elements")[0].remove(); ] 我认为函数 remove() 不是由数组实现的。为了删除类的所有元素或任何返回数组的选择器,您必须遍历所有元素并在每个元素上调用 remove()。
2021-03-22 04:35:20
在 chrome 控制台中运行它似乎只会在使用document.getElementsByClassName("my-elements").remove();. 编辑:实际上它删除了一堆但需要重新运行才能完成。在此页面上使用“评论复制”类进行尝试。
2021-03-22 04:35:20
@SedatKilinc,您是否尝试过实际的片段?不涉及数组,而是NodeListHTMLCollection是类似数组的元素集。第二个方法定义允许删除这些“元素集”。
2021-03-25 04:35:20

跨浏览器和 IE >= 11:

document.getElementById("element-id").outerHTML = "";
嘿@dgo,你摇滚!
2021-03-13 04:35:20
这似乎是最简单、最可靠和最快的解决方案。我不需要删除元素,所以我跳过了最后一行,但这不应该增加任何开销。注意:我在试图找到比$.readyjs更快的noscript标签替代品时发现了这一点为了按照我想要的方式使用它,我不得不将它包装在一个 1ms 的setTimeout函数中。这一次解决了我所有的问题。格拉西亚斯。
2021-03-17 04:35:20
请记住,outerHTML它仍然是标准的新(呃)补充。如果您在撰写本文时正在寻求对任何软件的支持 > 6,您将需要另一个解决方案。remove其他人提到函数也是类似的情况。像往常一样,实现 polyfill 是安全的。
2021-04-05 04:35:20
这比removeChild(在我的系统上大约 6-7%)要慢一些参见jsperf.com/clear-outerhtml-v-removechild/2
2021-04-06 04:35:20
如果这是您要删除的内容,则这可能会在 iframe 曾经所在的位置留下空间。
2021-04-09 04:35:20

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

function removeElement(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}
那么,为什么需要返回 elem 呢?为什么不function remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
2021-03-17 04:35:20
哇,怎么这么复杂。只需将元素本身而不是 id 字符串传递给函数。这样,元素在整个函数中都可以访问,而且它保持单行
2021-03-23 04:35:20
@ZachL:虽然您的解决方案可能看起来更明显,但它执行了两个较慢的 DOM 查找,而其他解决方案似乎想要避免这种情况。
2021-03-25 04:35:20
如果你想在一个班轮没有走出去,您可以更改elemremove.elem这样函数就可以引用自身,因此您不必创建另一个全局变量。:-)
2021-04-05 04:35:20
不起作用。错误太多。这有效: var elem = document.getElementById('id') ; elem.parentNode.removeChild(elem);
2021-04-07 04:35:20

element.remove()

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

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

请不要“修改原生 DOM 函数”
2021-04-09 04:35:20

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

但它在 IE7 及以下版本中不起作用。从 IE7 及以下版本,remove() 不起作用
2021-03-25 04:35:20
嘿伙计们,即使该参考文献没有这个,我也是偶然发现的。写作element.remove();会奏效。也许这是新的东西。但对我来说是第一次,它有效。我认为它应该一直有效,因为它是非常基本的必备东西。
2021-03-29 04:35:20
这回答了我最初的问题,但为什么 JavaScript 会这样工作?
2021-04-02 04:35:20
如果我不得不猜测,它像这样工作的原因是 DOM 元素无法删除自己。你正在从它的脚下取下众所周知的地毯。您必须将其从容器中取出。至少我是这么想的。
2021-04-03 04:35:20
我只是在这里猜测,但我认为它与内存管理有关。父节点最有可能持有指向子节点的指针列表。如果你刚刚删除了一个节点(不使用父节点),父节点仍然会持有指针并导致内存泄漏。因此 api 强制您调用父级上的函数来删除子级。这也很好,因为它可以通过子节点向下遍历树,在每个子节点上调用 remove ,并且不会泄漏内存。
2021-04-07 04:35:20