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


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.