Удалить все элементы содержание класс

104
27 ноября 2021, 19:10

Начал изучать чистый javascript. Представим проверку формы, где ошибки выводится под каждым тегом input элементом <span class="error"></span>. Необходимо удалить все элементы с классом error в блоке с формой. На jQuery функция бы выглядела так: $('.error').remove();. Собственно вопрос, как реализовать это на чистом javascript? Пробовал так и не совсем правильно отрабатывает функционал:

while(element.length) {
   element[0].parentNode.removeChild(element[0]);
}

Написал функцию, которая не отрабатывает :)

function removeElement(elementClass) {
    // Removes an element from the document
    let element = document.getElementsByClassName(elementClass);
    element.parentNode.removeChild(element);
    delete (element);
}
Answer 1
while(element.length) {
  element[0].parentNode.removeChild(element[0]);
}

Этот код работает конкретно в связке с getElementsByClassName - он возвращает "живой" список элементов, который будет обновляться после каждой операции. Так, начинается цикл: Удаляется первый[0] (в JS счет начинается с нуля) элемент из списка. Заново собирается весь список, снова удаляется первый элемент, и так по кругу.

А было бы приятно один раз собрать все элементы, по очереди всё удалить, и всё. Поэтому в большинстве случаев вместо getElements... используют querySelectorAll('.класс') - он один раз ищет элементы и возвращает статичный список. Предыдущий код не сработает для него, т.к. element.length не будет обновляться после каждого круга.

А вариантов удаления много:

let test = document.querySelectorAll('.className'); // обращаю внимание на точку
// Вариант адын
for( let i = 0; i < test.length; i++ ){
  test[i].outerHTML = "";
}
// Вариант два (forEach - метод массивов, но встроен еще в querySelectorAll)
test.forEach(function(elem){
  elem.parentNode.removeChild(elem);
});
// Варииант три (в JS тоже есть remove(), IE его не поддерживает)
test.forEach( e => e.remove() );
// Разные циклы использованы для разнообразия. Всё можно сделать через классический цикл.
Answer 2

Это правильный код:

  while (element.length) {
    element[0].parentNode.removeChild(element[0]);
  }

Что у Вас "и не совсем правильно отрабатывает"?

function removeElement(elementClass) { 
  let element = document.getElementsByClassName(elementClass); 
  while (element.length) { 
    element[0].parentNode.removeChild(element[0]); 
  } 
}
.error { 
  color: red; 
}
<button type="button" onclick="removeElement('error')">Remove</button> 
 
<span class="error">*</span> 
<span class="error">*</span> 
<span class="error">*</span> 
<span class="error">*</span>

Answer 3
elems = document.querySelectorAll('.error');
for(i=0; i<elems.length; i++) {
elems[i].parentNode.removeChild(elems[i]);
} 
READ ALSO
Удаление элемента массива и выдача случайного элемента в строку

Удаление элемента массива и выдача случайного элемента в строку

Я совсем новичок и имею проблемы с синтаксисом и русским языкомПомогите сделать чтобы программа загружала список имен из массив и при нажатии...

209
Как избавиться от ошибки Uncaught TypeError [закрыт]

Как избавиться от ошибки Uncaught TypeError [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

178
Как сделать код без переменной shift?

Как сделать код без переменной shift?

Есть вот такая часть из React-Redux приложения:

146
Браузер Xiaomi и загрузка файлов html форма

Браузер Xiaomi и загрузка файлов html форма

ХелоСтолкнулся с такой бедой

173