Подтвердить что ты не робот

Удаление элементов по имени класса?

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

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

4b9b3361

Ответ 1

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

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

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

element.parentNode.removeChild(element);

Ответ 2

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

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

Ответ 3

Используя 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>

Ответ 4

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

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

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

Ответ 5

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

  • Получить контейнерный элемент по идентификатору.
  • Получить дочерние элементы по имени тега.
  • Итерация над детьми, проверка соответствия свойства 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

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

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

Ответ 7

Я предпочитаю использовать forEach более чем for/while цикла. Чтобы использовать его, необходимо HTMLCollection преобразовать HTMLCollection в Array:

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

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

Ответ 8

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

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

Ответ 9

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

Например:

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

Ответ 10

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

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

Ответ 11

Если вы хотите удалить элементы, которые добавляются динамически, попробуйте следующее:

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

Ответ 12

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();

Ответ 13

Вам следует попробовать jQuery, гораздо проще выбирать элементы и редактировать их.

С jQuery ваш код должен выглядеть так:

$( document ).ready( function() {

    // Select all elements with class name 'className' and remove them
    $( ".className" ).remove();

});

Вместо удаления вы можете изменить свойство отображения css на none!

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

// Now remove them
cur_columns.style.display= "none";

Надеюсь, это помогло!

Ответ 14

Ошибка пропущенных элементов в этом (код сверху)

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]);
   }
}

Ответ 15

Вы можете использовать простое решение, просто изменив класс, обновится фильтр HTML Collection:

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