通过类名删除元素?


126

我有以下代码来查找具有其类名的元素:

// Get the element by their class name
var cur_columns = document.getElementsByClassName('column');

// Now remove them

for (var i = 0; i < cur_columns.length; i++) {

}

我只是不知道如何删除它们。处理此问题的最佳方法是什么?

@ Karim79:

这是JS:

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");
var len = col_wrapper.length;

alert(len);

for (var i = 0; i < len; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        col_wrapper[i].parentNode.removeChild(col_wrapper[i]);
    }
}

这是HTML:

<div class="columns" id="columns">
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div name="columnClear" class="contentClear" id="columnClear"></div>
</div>

编辑:最终只使用jQuery选项。


4
老实说,最好的方法是只使用jQuery。真的不明白为什么有人会想要手动进行DOM操作。
泰勒屋檐

7
我不知道,哈哈...。我只是觉得了解框架并不了解能够实际使用香草JS的知识。由于我不是一个非常喜欢JS的人,因此我尝试在使用它时仅使用Vanilla JS编写代码,这样我就不会忘记事情了
Brett

20
对。到底谁愿意成为一个知识渊博且全面的开发人员。荒诞!
user113716 2011年

1
当然,一个好的方法只是因为您使用的是jQuery,并不意味着您必须放弃对它的工作方式或底层DOM提供的内容的了解。如果需要,您可以修理汽车(DOM),但是您的机械师可能对此更有经验(jQuery团队)。
Lior Cohen

2
@Lior:是的,我的机械师不需要帮我转动钥匙或滚下窗户。; o)
user113716 2011年

Answers:


188

使用jQuery(我想在这种情况下确实可以使用jQuery),您可以这样做:

$('.column').remove();

否则,您将需要使用每个元素的父元素将其删除:

element.parentNode.removeChild(element);

41
+0.75使用jQuery,+ 0.25也提供非jQuery解决方案:p
ThiefMaster

7
+0.01使用jQuery,+ 0.99也提供非jQuery解决方案:p
Alex Pyzhianov

183

如果您不想使用JQuery:

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}

1
数量惊人的无效解决方案。这是对的。谢谢!
penguinsource

11
如果有人想知道为什么他总是要删除第一个元素(索引为0),那是因为当您删除一个元素时,它也会缩小elements数组。
杰斐逊·利马

其他索引(接受0索引)呢?
ofir_aghai

1
@ofir_aghai就像@JeffersonLima指出的getElementsByClassName是实时收集。developer.mozilla.org/zh-CN/docs/Web/API/NodeList
Veikko Karsikko,

2
关于元素数组缩小的事实的不错观察
ferralucho 18-2-27

33

使用ES6,您可以做到:

const removeElements = (elms) => elms.forEach(el => el.remove());

// Use like:
removeElements( document.querySelectorAll(".remove") );
<p class="remove">REMOVE ME</p>
<p>KEEP ME</p>
<p class="remove">REMOVE ME</p>


要进一步利用ES6,该如何做:var removeElements =(elms)=> [... elms] .forEach(el => el.remove());
Calculuswhiz

1
最佳答案谢谢!
弗朗切斯科

25

在纯Javascript中,没有jQuery或ES6,您可以执行以下操作:

const elements = document.getElementsByClassName("my-class");

while (elements.length > 0) elements[0].remove();

2
没有jQuery和ES6的最清晰答案
Eric

2
也许您的答案稍后出现-应该被接受,因为它与jQuery无关。通常,最好使用vanilla-js,不是吗?
Luckyfella,

没有不必要且繁琐的jQuery的最佳答案。对jQuery说不。是的,香草冰!
塔纳西斯

13

这对我有用

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }

10

Brett-您是否知道根据quirksmodegetElementyByClassName从IE 5.5到8的支持不存在?如果您关心跨浏览器的兼容性,那么最好遵循以下模式:

  • 通过ID获取容器元素。
  • 通过标签名称获取所需的子元素。
  • 遍历子级,测试是否匹配className属性。
  • elements[i].parentNode.removeChild(elements[i]) 就像其他人说的那样。

快速示例:

var cells = document.getElementById("myTable").getElementsByTagName("td");
var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

这是一个快速演示。

编辑:这是特定于您的标记的固定版本:

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");

var elementsToRemove = [];
for (var i = 0; i < col_wrapper.length; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        elementsToRemove.push(col_wrapper[i]);
    }
}
for(var i = 0; i < elementsToRemove.length; i++) {
    elementsToRemove[i].parentNode.removeChild(elementsToRemove[i]);
}

问题是我的错。当从结果元素数组中删除一个元素时,长度会改变,因此每次迭代都会跳过一个元素。解决方案是将对每个元素的引用存储在临时数组中,然后在这些元素上循环,从DOM中删除每个元素。

在这里尝试。


谢谢您-尽管这不是一个很大的问题,因为它是针对管理部分的,所以确实有人会使用它....,但仍会考虑您的评论。
Brett

@Brett-还是这样做!这将花费您几分钟的时间,并且您会在办公室得到额外的高度感:)
karim79 2011年

好的,我尝试了一下...当我发出警报时,它报告了正确数量的元素,但是它只删除了具有该类名称的四个元素中的两个,并且出现了此错误:col_wrapper [i]未定义。我将使用我使用的代码更新我的帖子。
Brett

@Brett-如果您有兴趣,我已修复您的更新代码,并对问题进行了评论。
karim79 2011年

伙计,这对我的帮助超出了您过去两个小时遇到的困扰。谢谢!
Zoolander 2012年

4

我更喜欢使用forEachfor/ while循环。为了使用它,必须先转换HTMLCollectionArray

Array.from(document.getElementsByClassName("post-text"))
    .forEach(element => element.remove());

请注意,这不是最有效的方法。对我来说更优雅。


4

一条线

document.querySelectorAll(".remove").forEach(el => el.remove());

例如,您可以在此页面中删除userinfo

document.querySelectorAll(".user-info").forEach(el => el.remove());

1

是的,您必须从父项中删除:

cur_columns[i].parentNode.removeChild(cur_columns[i]);

1

您可以使用以下语法: node.parentNode

例如:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);

2
这个问题要求按
班级名称

1

递归函数可能会解决您的问题,如下所示

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();

1
哈哈避免了循环。<3
伊万·伊夫科维奇(IvanIvković)

0

如果您要删除动态添加的元素,请尝试以下操作:

document.body.addEventListener('DOMSubtreeModified', function(event) {
    const elements = document.getElementsByClassName('your-class-name');
    while (elements.length > 0) elements[0].remove();
});

0
const elem= document.getElementsByClassName('column')

for (let i = elem.length; 0 < i ; )
    elem[--i].remove();

要么

const elem= document.getElementsByClassName('column')

while (elem.length > 0 )
    elem[0].remove();

0

这是非常简单的单行代码,使用ES6传播运算符(由于document.getElementByClassName返回HTML集合)。

[...document.getElementsByClassName('dz-preview')].map(thumb => thumb.remove());

-1

跳过元素中的错误(上面的代码)

var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

可以通过如下所示向后运行循环来修复(因此不需要临时数组)

var len = cells.length;
for(var i = len-1; i >-1; i--) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
   }
}

这有点复杂。为什么不使用while循环呢?(请参阅我的回答)
tocqueville '16

@tocqueville发布的问题使用了for循环。我只是在指出如何以最小的代码更改来修复该错误。
shao.lo

-3

您可以使用一个简单的解决方案,只需更改类,即可更新HTML集合过滤器:

var cur_columns = document.getElementsByClassName('column');

for (i in cur_columns) {
   cur_columns[i].className = '';
}

参考:http : //www.w3.org/TR/2011/WD-html5-author-20110705/common-dom-interfaces.html


1
由于循环数组是在循环本身内部修改的,因此这将不起作用。结果是最后一个元素将被跳过。
tocqueville '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.