Видалення елементів за назвою класу?


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
Правильно. Хто на землі хотів би бути знаючим та всебічним розробником. Абсурд!
користувач113716

1
Звичайно, хороший підхід, але те, що ви використовуєте jQuery, не означає, що вам слід відмовлятися від розуміння того, як він працює або що пропонує базовий DOM. Можливо, ви могли б виправити свій автомобіль, якщо хотіли (DOM), але ваш механік, мабуть, більш досвідчений у цьому (команда jQuery).
Lior Cohen

2
@ Lior: Так, добре, що моєму механіку не потрібно допомагати мені повернути ключ або скатити вікно. ; o)
користувач113716

Відповіді:


189

Використовуючи jQuery (я думаю, що ви насправді могли б використовувати в цьому випадку, ви можете зробити це так):

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

В іншому випадку вам потрібно буде використовувати батьківський елемент кожного елемента для його видалення:

element.parentNode.removeChild(element);

41
+0,75 для використання jQuery, +0,25 для надання також рішення, яке не jQuery: p
ThiefMaster

7
+0.01 для використання jQuery, +0.99 для надання також рішення, яке не jQuery: p
Алекс Пижиянов

183

Якщо ви не бажаєте використовувати 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

1
@ofir_aghai як @JeffersonLima вказує, що getElementsByClassNameце жива колекція. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko

2
Приємне спостереження про те, що масив елементів скорочується
ferralucho

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. Взагалі краще використовувати ваніль-js, чи не так?
Luckyfella

Найкраща відповідь без зайвих і навантажених jQuery. Скажіть "ні" jQuery. Так, ванільний лід!
Танасіс

13

Це працює для мене

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

10

Бретт - чи ти знаєш, що 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]);
    }
}

Ось швидка демонстрація.

EDIT: Ось фіксована версія, специфічна для вашої розмітки:

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 - роби це все одно! Це займе кілька хвилин вашого часу, і ви отримаєте додаткові високі п’ятірки в офісі :)
karim79

Добре, я спробував це ... він повідомив про правильну кількість елементів, коли я робив попередження, але він видалив лише два з чотирьох із цим іменем класу, і я отримав цю помилку: col_wrapper [i] не визначено. Я оновлю свою посаду кодом, який я використав.
Бретт

@Brett - якщо ти зацікавився, я виправив ваш оновлений код і прокоментував проблему.
karim79

Людина, це допомогло мені більше, ніж ти міг уявити, із питання, про яке я заплутався протягом останніх двох годин. СПАСИБІ!
Золандер

4

Я вважаю за краще використовувати forEachover for/ whilelooping. Для використання необхідно перетворитись 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);

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

Це трохи складно. Чому б замість цього не використати цикл часу? (див. мою відповідь)
tocqueville

@tocqueville У розміщеному запитанні використовується цикл. Я просто вказував, як виправити помилку з мінімальними змінами його коду.
shao.lo

-3

Ви можете скористатися простим рішенням, просто змінити клас, оновлений фільтр колекції HTML:

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
Це не працюватиме, оскільки масив циклу модифікується всередині самого циклу. Результат - останній елемент буде пропущений.
tocqueville
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.