Удаление элементов по имени класса? - PullRequest
86 голосов
/ 24 января 2011

У меня есть код ниже, чтобы найти элементы с их именем класса:

// 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.

Ответы [ 13 ]

146 голосов
/ 24 января 2011

Используя jQuery (который вы действительно могли бы использовать в этом случае, я думаю), вы можете сделать это так:

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

В противном случае вам потребуется использовать родительский элемент каждого элемента, чтобы удалить его:

element.parentNode.removeChild(element);
137 голосов
/ 28 декабря 2012

Если вы предпочитаете не использовать JQuery:

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}
26 голосов
/ 16 октября 2016

Используя 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>
14 голосов
/ 30 сентября 2016

Без jQuery вы можете сделать:

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

while (elements.length > 0) elements[0].remove();
10 голосов
/ 24 января 2011

Бретт - знаете ли вы, что getElementyByClassName поддержка от IE 5,5 до 8 не существует согласно quirksmode ?. Если вы заботитесь о кросс-браузерной совместимости, вам будет лучше следовать этой схеме:

  • Получить элемент контейнера по 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.

Попробуйте здесь.

6 голосов
/ 27 июня 2018

Это работает для меня

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }
3 голосов
/ 18 февраля 2018

Я предпочитаю использовать forEach вместо for / while.Для использования необходимо сначала преобразовать HTMLCollection в Array:

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

Обратите внимание, это не самый эффективный способПросто гораздо элегантнее для меня.

1 голос
/ 24 января 2011

Вы можете использовать этот синтаксис: node.parentNode

Например:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
1 голос
/ 24 января 2011

Да, вы должны удалить из родительского:

cur_columns[i].parentNode.removeChild(cur_columns[i]);
0 голосов
/ 20 марта 2019

Рекурсивная функция может решить вашу проблему, как показано ниже

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