Подтвердить что ты не робот

Удалить элемент по имени тега

Возможный дубликат:
используйте remove() для нескольких элементов

Я пытаюсь удалить все элементы с именем тега "label". У меня есть следующий код. Он работает в некоторой степени, но он удаляет только 1 ярлык. Остальные 5 все еще остаются. Как я могу изменить код для удаления всех тегов метки?

element = document.getElementsByTagName("label");
for (index = 0; index < element.length; index++) {
    element[index].parentNode.removeChild(element[index]);
}
4b9b3361

Ответ 1

var element = document.getElementsByTagName("label"), index;

for (index = element.length - 1; index >= 0; index--) {
    element[index].parentNode.removeChild(element[index]);
}

Ответ 2

Проблема заключается в том, что document.getElementsByTagName() возвращает NodeList, а не Array. Содержимое, а следовательно и длина, NodeList обновляется при удалении элемента из DOM, который находится в NodeList. Поэтому, когда вы удаляете первый элемент, NodeList становится короче, а новый первый элемент занимает index 0. Обновление index в цикле поэтому заставляет вас пропускать хотя бы один элемент, возможно, больше в зависимости от длины результата.

Попробуйте что-то вроде этого:

var elements = document.getElementsByTagName('label')
while (elements[0]) elements[0].parentNode.removeChild(elements[0])

Ответ 3

Когда вы удаляете узлы из документа, список узлов, которые вы только что получили из getElementsByTagName(), также обновляется, чтобы избежать затяжных ссылок, поэтому вам следует просто удалить первый node, пока не останется.

var nodes = document.getElementsByTagName("label");

for (var i = 0, len = nodes.length; i != len; ++i) {
    nodes[0].parentNode.removeChild(nodes[0]);
}

Здесь значение nodes.length кэшируется; в противном случае он будет уменьшаться, и вы в конечном итоге удалите только половину:)

Ответ 4

"Проблема" в том, что .getElementsByTagName() возвращает Live NodeList. Следовательно, когда вы удаляете начальную (первую) запись, хвост заполняется и перемещается влево, так сказать.

Это не настоящий массив Javascript, где это будет работать так, как ожидалось. Чтобы создать такой замороженный массив, мы можем пойти как

var element = Array.prototype.slice.call(document.getElementsByTagName("label"),0); 

for (var index = 0, len = element.length; index < len; index++) {
    element[index].parentNode.removeChild(element[index]);
}

Ответ 5

Почему бы не использовать jQuery? Тогда просто

$("label").remove();