Ответ 1
var element = document.getElementsByTagName("label"), index;
for (index = element.length - 1; index >= 0; index--) {
element[index].parentNode.removeChild(element[index]);
}
Возможный дубликат:
используйте remove() для нескольких элементов
Я пытаюсь удалить все элементы с именем тега "label". У меня есть следующий код. Он работает в некоторой степени, но он удаляет только 1 ярлык. Остальные 5 все еще остаются. Как я могу изменить код для удаления всех тегов метки?
element = document.getElementsByTagName("label");
for (index = 0; index < element.length; index++) {
element[index].parentNode.removeChild(element[index]);
}
var element = document.getElementsByTagName("label"), index;
for (index = element.length - 1; index >= 0; index--) {
element[index].parentNode.removeChild(element[index]);
}
Проблема заключается в том, что 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])
Когда вы удаляете узлы из документа, список узлов, которые вы только что получили из 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
кэшируется; в противном случае он будет уменьшаться, и вы в конечном итоге удалите только половину:)
"Проблема" в том, что .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]);
}
Почему бы не использовать jQuery? Тогда просто
$("label").remove();