使用JavaScript删除某个类的所有元素

jon*_*ell 46 javascript

HTML:

var paras = document.getElementsByClassName('hi');

for (var i = 0; i < paras.length; i++) {
  paras[i].style.color = '#ff0011';
  // $('.hi').remove();
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止的JS:

<p class="hi">dood</p>
<p class="hi">dood</p>
<p class="hi">dood</p>
<p class="hi">dood</p>
<p class="hi">dood</p>
<p>not class 'hi'</p>
Run Code Online (Sandbox Code Playgroud)

在jQuery中,这太简单了.($('.hi').remove();).我想学习JS,然后学习jQuery.

我被困了,谷歌没有提供.我不想成为复制/粘贴jQuery程序员.我刚开始学习JS.谢谢.

Pau*_*aul 86

要删除元素,请执行以下操作:

el.parentNode.removeChild(el);
Run Code Online (Sandbox Code Playgroud)

MDN是一个很好的参考.以下是一些相关页面:

节点
parentNode
removeChild

但是,如果你像这样循环,你会遇到问题,因为getElementsByClassName返回一个实时列表,当你删除一个节点时,元素也会从列表中删除,所以你不应该增加或者你最终会跳过所有其他元素.而是只是不断删除列表中的第一个元素,直到没有第一个元素:

var paras = document.getElementsByClassName('hi');

while(paras[0]) {
    paras[0].parentNode.removeChild(paras[0]);
}?
Run Code Online (Sandbox Code Playgroud)

IMO jQuery很高兴向您展示Javascript中可以做什么.我实际上建议在大约一到两周的普通JS之后你学习jQuery,擅长它,并记住它抽象出来的东西.有一天,当你对使用jQuery时可以获得的Javascript范围,对象等有很好的把握时,请回过头来尝试学习如何在没有库的情况下更好地与DOM进行交互.这样你就可以更轻松地学习普通的JS,你会欣赏图书馆可以为你提供更多的抽象,同时了解当你只需要一两件东西时,你可以自己编写包括整个图书馆.

  • @ jonny.milano我认为你最好在读取像MDN这样的参考页面时自己尝试一下,看看它们是如何回应的.还要确保你有一个好的控制台可以玩,并可以使用console.log之类的东西.Chrome的开发人员工具有一个很好的功能,如果你在Elements页面下突出显示一个元素,你可以使用变量`$ 0`从控制台中引用它. (2认同)

Phr*_*ogz 16

[].forEach.call(document.querySelectorAll('.hi'),function(e){
  e.parentNode.removeChild(e);
});
Run Code Online (Sandbox Code Playgroud)

这里我Array.prototype.forEach用来轻松遍历类似数组的对象中的所有元素,即返回的静态NodeList querySelectorAll,然后使用removeChild()从DOM中删除项.

对于不支持的旧版浏览器querySelectorAll()forEach():

var classMatcher = /(?:^|\s)hi(?:\s|$)/;
var els = document.getElementsByTagName('*');
for (var i=els.length;i--;){
  if (classMatcher.test(els[i].className)){
    els[i].parentNode.removeChild(els[i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,因为getElementsByTagName返回实时 NodeList,所以必须从后到前迭代项目,同时从DOM中删除它们.

还有一些较旧的浏览器不支持querySelectorAll但支持getElementsByClassName,您可以使用它来提高性能和减少代码.

  • 不幸的是,“现代”浏览器只是正在使用的浏览器的一个子集。在大多数情况下,“现代”被定义为“使用我的代码时不会中断的浏览器”。但怪异模式下的 IE 8 至少没有 qSA,即使在标准模式下,如果将主机对象传递给内置方法也会抛出错误。大约 50% 的 IE 用户使用 IE 8,因此它可能并不“现代”,但如果您希望为通用 Web 编写健壮的代码,则不能忽略它。 (2认同)

leo*_*ess 5

简单的ES6答案:

document.querySelectorAll('.classname').forEach(e => e.remove());
Run Code Online (Sandbox Code Playgroud)

说明:

  1. document.querySelectorAll()循环通过文档返回一个中的元素节点列表与指定的选择器的所有元件(例如'.class''#id''button'
  2. forEach() 遍历NodeList并为每个元素执行指定的操作
  3. e => e.remove() 从DOM中删除元素

但是请注意,并非所有浏览器(即IE)都支持此解决方案

  • 真的很喜欢这个。如果你非常需要 IE 支持,你可以制作类似:`document.querySelectorAll('.classname').forEach(e =&gt; e.parentNode.removeChild(e));`来避免polyfills等... (3认同)