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


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, я пытаюсь и просто кодирую на ванильном 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
Вейкко Карсикко


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.

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


Спасибо за это - хотя это не большая проблема, поскольку это для раздела администратора, поэтому на самом деле один человек будет его использовать ... но все равно примет во внимание ваши комментарии.
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

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

Например:

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

2
Этот вопрос задал для удаления className
JoeTidee

1

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

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

1
Ха-ха избежал петли. <3
Иван Ивкович

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? (см. мой ответ)
Токвиль 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.