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

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.

Brett
источник
4
Честно говоря, лучший способ - просто использовать jQuery. Не совсем понимаю, почему кто-то больше хочет манипулировать DOM вручную.
Тайлер Ивз
7
Я не знаю, лол .... Я просто чувствую себя грязным, зная фреймворки и не имея никаких знаний о том, как на самом деле использовать ванильный JS. Так как я не ОГРОМНЫЙ человек, использующий JS, я пытаюсь и просто кодирую на ванильном JS, когда использую его, чтобы не забывать о вещах, лол
Бретт
20
Правильно. Кто вообще хотел бы быть знающим и разносторонним разработчиком. Абсурд!
user113716
1
Конечно, это хороший подход, но только потому, что вы используете jQuery, не означает, что вам нужно отказываться от понимания того, как он работает или что предлагает базовая DOM. Вы, вероятно, могли бы починить свою машину, если бы захотели (DOM), но ваш механик, вероятно, более опытен в этом (команда jQuery).
Лиор Коэн
2
@Lior: Да, моему механику не нужно помогать мне повернуть ключ или опустить окно. ; o)
user113716

Ответы:

189

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

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

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

element.parentNode.removeChild(element);
Лиор Коэн
источник
41
+0,75 за использование jQuery, +0,25 за предоставление решения, отличного от jQuery: p
ThiefMaster
8
+0,01 за использование jQuery, +0,99 за предоставление решения, отличного от jQuery: p
Алекс Пыжианов
184

Если вы предпочитаете не использовать 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 02
1
@ofir_aghai, как указывает @JeffersonLima getElementsByClassName, это живая коллекция. developer.mozilla.org/en-US/docs/Web/API/NodeList
Вейкко Карсикко
2
Замечательное
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
Эрик
2
Возможно, ваш ответ пришел позже - должен быть принят, потому что он не зависит от jQuery. В общем, лучше использовать vanilla-js, не так ли?
Luckyfella,
Лучший ответ без ненужного и громоздкого jQuery. Скажите НЕТ jQuery. Да ванильному льду!
Thanasis
13

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

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }
Уляна Різник
источник
10

Бретт - Вы в курсе , что 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.

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

karim79
источник
Спасибо за это - хотя это не большая проблема, поскольку это для раздела администратора, поэтому на самом деле один человек будет его использовать ... но все равно примет во внимание ваши комментарии.
Brett
@Brett - все равно сделай это! Это займет несколько минут вашего времени, и вы получите дополнительные пять в офисе :)
karim79
Хорошо, я попробовал это ... он сообщил правильное количество элементов, когда я сделал предупреждение, но он удалил только два из четырех с этим именем класса, и я получил эту ошибку: col_wrapper [i] is undefined. Я обновлю свой пост кодом, который использовал.
Brett
@Brett - если вам интересно, я исправил ваш обновленный код и прокомментировал проблему.
karim79
Чувак, это помогло мне больше, чем вы могли представить, с проблемой, с которой я столкнулся за последние два часа. СПАСИБО!
Zoolander
4

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

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

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

Александр
источник
4

Одна линия

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

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

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);
Computerish
источник
2
Этот вопрос задал для удаления className
JoeTidee
1

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

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();
Может PERK
источник
1
Ха-ха избежал петли. <3
Иван Ивкович
0

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

document.body.addEventListener('DOMSubtreeModified', function(event) {
    const elements = document.getElementsByClassName('your-class-name');
    while (elements.length > 0) elements[0].remove();
});
lchachurski
источник
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]);
   }
}
shao.lo
источник
Это немного сложно. Почему бы вместо этого не использовать цикл while? (см. мой ответ)
Токвиль 02
@tocqueville В опубликованном вопросе использовался цикл for. Я просто указывал, как исправить ошибку с минимальными изменениями в его коде.
shao.lo
-3

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

Густаво Руис
источник
1
Это не сработает, поскольку массив цикла изменяется внутри самого цикла. В результате будет пропущен последний элемент.
Токвиль, 02