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

У меня есть приведенный ниже код для поиска элементов с их именем класса:

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


person Brett    schedule 23.01.2011    source источник
comment
Честно говоря, лучший способ - просто использовать jQuery. Не совсем понимаю, почему кто-то больше хочет манипулировать DOM вручную.   -  person Tyler Eaves    schedule 24.01.2011
comment
Я не знаю, лол .... Я просто чувствую себя грязным, зная фреймворки и не имея никаких знаний о том, как на самом деле использовать ванильный JS. Так как я не ОГРОМНЫЙ человек, использующий JS, я стараюсь и просто кодирую ванильный JS, когда использую его, поэтому я не забываю вещи, лол   -  person Brett    schedule 24.01.2011
comment
Верно. Кто вообще хотел бы быть знающим и всесторонним разработчиком. Абсурд!   -  person user113716    schedule 24.01.2011
comment
Конечно, это хороший подход, но только потому, что вы используете jQuery, не означает, что вам нужно отказываться от понимания того, как он работает или что предлагает базовая DOM. Вы, вероятно, могли бы починить свою машину, если бы захотели (DOM), но ваш механик, вероятно, более опытен в этом (команда jQuery).   -  person Lior Cohen    schedule 24.01.2011
comment
@ Лиор: Да, моему механику не нужно помогать мне повернуть ключ или опустить мое окно. ; о)   -  person user113716    schedule 24.01.2011


Ответы (16)


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

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

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

element.parentNode.removeChild(element);
person Lior Cohen    schedule 23.01.2011
comment
+0,75 за использование jQuery, +0,25 за предоставление решения, отличного от jQuery: p - person ThiefMaster; 24.01.2011
comment
+0,01 за использование jQuery, +0,99 за предоставление решения, отличного от jQuery: p - person Alex Pyzhianov; 15.05.2020

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

function removeElementsByClass(className){
    const elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}
person Veikko Karsikko    schedule 28.12.2012
comment
Удивительное количество неработающих решений. Это правильно. Спасибо! - person penguinsource; 17.03.2017
comment
Если кому-то интересно, почему он всегда удаляет первый элемент (индекс 0), это потому, что когда вы удаляете элемент, он также сжимает массив elements. - person Jefferson Lima; 27.07.2017
comment
как насчет других индексов (принять индекс 0)? - person ofir_aghai; 02.08.2017
comment
@ofir_aghai, поскольку @JeffersonLima указывает, что getElementsByClassName - это живая коллекция. developer.mozilla.org/en-US/docs/Web/API/ NodeList - person Veikko Karsikko; 07.08.2017
comment
JQuery - это огромное количество зависимостей, которые не обязательно используют +1, чтобы не использовать jquery. - person ßiansor Å. Ålmerol; 14.01.2018
comment
Хорошее наблюдение о том, что массив элементов сжимается - person ferralucho; 27.02.2018
comment
Это лучший подход, поскольку он основан на чистом JS. - person Raz; 15.10.2019

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

person Roko C. Buljan    schedule 16.10.2016
comment
Чтобы воспользоваться преимуществами ES6, как насчет: var removeElements = (elms) = ›[... elms] .forEach (el =› el.remove ()); - person Calculuswhiz; 08.12.2017
comment
Лучший ответ Спасибо! - person Francesco; 24.05.2018

В чистом ванильном Javascript, без jQuery или ES6, вы могли:

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

while (elements.length > 0) elements[0].remove();
person tocqueville    schedule 30.09.2016
comment
Самый четкий ответ без jQuery и ES6 - person Eric; 02.01.2018
comment
Возможно, ваш ответ пришел позже - он должен быть принятым, потому что он не зависит от jQuery. В общем, лучше использовать vanilla-js, не так ли? - person Luckyfella; 03.03.2020
comment
Лучший ответ без ненужного и громоздкого jQuery. Скажите НЕТ jQuery. Да, ванильному льду! - person Thanasis; 18.06.2020
comment
Этот работает на WordPress с использованием конструктора страниц Elementor и добавления элемента HTML для добавления JavaScript без необходимости платить за версию Pro. - person Maduro; 04.10.2020

Одна линия

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

Например, вы можете сделать на этой странице, чтобы удалить информацию о пользователе.

document.querySelectorAll(".user-info").forEach(el => el.remove());
person Mohsen    schedule 31.03.2020
comment
Очень кстати! Спасибо - person Zaki Mohammed; 05.01.2021

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

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }
person Уляна Різник    schedule 27.06.2018

Бретт, знаете ли вы, что 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.

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

person karim79    schedule 23.01.2011
comment
Спасибо за это - хотя это не большая проблема, поскольку это для раздела администратора, поэтому на самом деле один человек будет его использовать ... но все равно примет во внимание ваши комментарии. - person Brett; 24.01.2011
comment
@Brett - все равно сделай это! Это займет несколько минут вашего времени, и вы получите дополнительные пять в офисе :) - person karim79; 24.01.2011
comment
Хорошо, я попробовал это ... он сообщил правильное количество элементов, когда я сделал предупреждение, но он удалил только два из четырех с этим именем класса, и я получил эту ошибку: col_wrapper [i] is undefined. Я обновлю свой пост кодом, который использовал. - person Brett; 24.01.2011
comment
@Brett - если вам интересно, я исправил ваш обновленный код и прокомментировал проблему. - person karim79; 24.01.2011
comment
Чувак, это помогло мне больше, чем вы могли представить, с проблемой, с которой я столкнулся за последние два часа. БЛАГОДАРЮ ВАС! - person Zoolander; 21.01.2012

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

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

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

person Alexander    schedule 18.02.2018

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

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

Это очень просто, однострочно, с использованием оператора распространения ES6 из-за document.getElementByClassName возвращает коллекцию HTML.

[...document.getElementsByClassName('dz-preview')].map(thumb => thumb.remove());
person Wolfgang Leon    schedule 08.01.2020

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

cur_columns[i].parentNode.removeChild(cur_columns[i]);
person David Tang    schedule 23.01.2011

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

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();
person Can PERK    schedule 20.03.2019
comment
Ха-ха, избежал петли. ‹3 - person Glorious Kale; 19.07.2019

Вот как я выполнил аналогичную задачу на чистом JavaScript.

function setup(item){
   document.querySelectorAll(".column") /* find all classes named column */
  .forEach((item) => { item /* loop  through each item */
      .addEventListener("click", (event) => { item
        /* add event listener for each item found */
          .remove(); /* remove self - changed node as needed */
      });
  });
  }

  setup();
<div class="columns" id="columns">
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows1</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows2</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows3</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows4</div>
    <div name="columnClear" class="contentClear" id="columnClear"></div>
</div>

person ZStoneDPM    schedule 27.01.2021

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

Например:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
person Computerish    schedule 23.01.2011
comment
Этот вопрос попросил удалить className - person JoeTidee; 23.07.2017

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

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]);
   }
}
person shao.lo    schedule 04.02.2014
comment
Это немного сложно. Почему бы вместо этого не использовать цикл while? (см. мой ответ) - person tocqueville; 02.10.2016
comment
@tocqueville В опубликованном вопросе использовался цикл for. Я просто указывал, как исправить ошибку с минимальными изменениями в его коде. - person shao.lo; 29.08.2017

Вы можете использовать простое решение, просто измените класс, обновится фильтр 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

person Gustavo Ruiz    schedule 25.06.2014
comment
Это не сработает, поскольку массив цикла изменяется внутри самого цикла. В результате будет пропущен последний элемент. - person tocqueville; 02.10.2016