74

这似乎可以快速回答,但我找不到。也许我在搜索错误的术语?请不要使用库,尽管我不需要跨浏览器后备,但我的目标是该项目的所有最新版本。

我得到了一些元素:

element = document.querySelectorAll(".someselector");

这是有效的,但我现在如何删除这些元素?我是否必须遍历它们并执行此操作element.parentNode.removeChild(element);,还是缺少一个简单的功能?

4

3 回答 3

85

是的,你几乎是对的。.querySelectorAll返回一个冻结的 NodeList。你需要迭代它并做一些事情。

Array.prototype.forEach.call( element, function( node ) {
    node.parentNode.removeChild( node );
});

即使你只有一个结果,你也需要通过索引来访问它,比如

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

如果您只想查询一个元素,请.querySelector改用。在那里,您只需获取节点引用,而无需使用索引进行访问。

于 2012-10-29T16:35:43.167 回答
62

由于NodeList已经支持forEach您可以使用:

document.querySelectorAll(".someselector").forEach(e => e.remove());
<div>
  <span class="someselector">element 1</span>
  <span class="someselector">element 2</span>
  there shouldn't be any of the above "element" spans after you run the code
</div>

请参阅NodeList.prototype.forEach()Element.remove()

Internet Explorer 支持。IE 不支持forEachon theNodeList并且 IE 也不支持对象remove上的方法Element。因此,如果您还希望在 IE 中运行上述代码,只需在 JavaScript 代码的开头添加以下行,并使用Node.removeChild删除元素(或使用Element.remove() polyfill ):

if (!NodeList.prototype.forEach && Array.prototype.forEach) {
    NodeList.prototype.forEach = Array.prototype.forEach;
}
// ..then continue as usual with the forEach
document.querySelectorAll(".someselector").forEach(e => e.parentNode.removeChild(e));
<div>
  <span class="someselector">element 1</span>
  <span class="someselector">element 2</span>
  Should be empty
</div>

于 2017-09-26T11:11:14.127 回答
26

使用Array.fromChildNode.remove更加简洁:

Array.from(document.querySelectorAll('.someselector')).forEach(el => el.remove());

好的,刚刚看到 NodeList 是可迭代的,所以它可以做得更短:

document.querySelectorAll('.someselector').forEach(el => el.remove());
于 2019-01-24T09:20:49.643 回答