@greenEnTiRe

Почему удаляются не все элементы?

Требуется создать кнопку, которая создаёт параграфы. После того, как элементов станет больше 10, по нажатию той же кнопки все элементы должны удаляться.

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>События клавиатуры</title>
    <style type="text/css">
    	
    </style>
    <script>
    	window.onload = function(){
    		document.getElementById("btn").onclick = function(){
    			var body = document.getElementById("body");
    			var p = document.createElement("p");
    			var allP = document.getElementsByTagName("p");
    			if(allP.length > 10) {
    				for(var i = 0; i < allP.length; i++){
    					body.removeChild(allP[i]);
    					
    				}
    				return false;
    			}
    			p.innerHTML = "PARAGRAPH";
    			body.appendChild(p);
    		}
    	}
    </script>

</head>
<body id="body">
  <button id="btn">Create Element</button>
</body>
</html>
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Дело в том, что getElementsByTagName возвращает динамическую коллекцию элементов, т.е. такую, которая автоматически обновляется при добавлении/удалении элементов. Поэтому сейчас у вас происходит следующее: удалили элемент с индексом 0, и у всех остальных элементов изменился индекс на единицу вниз, 0 вместо 1, 1 вместо 2 и т.д. При этом счётчик цикла вы на единицу увеличили, так что на следующей итерации удаляете элемент с индексом 1 - бывший 2. А тот, который был 1 и стал 0 - его вы пропускаете. А после следующего удаления пропускаете ещё один. Ну и т.д. Каждый второй.

Какие тут есть варианты действий:

  • Замените document.getElementsByTagName("p") на document.querySelectorAll('p'), так вы получите статическую коллекцию элементов.
  • Перебирайте содержимое allP от конца к началу:

    for (let i = allP.length; i--;) {
      body.removeChild(allP[i]);
    }

  • Удаляйте элемент с нулевым индексом, пока есть что удалять:

    while (allP.length) {
      allP[0].remove();
    }



Ну и ещё кое-что. Обращаться к body по id - безумие, этот элемент существует в единственном экземпляре и ссылка на него доступна как свойство объекта document. Так что id уберите и замените document.getElementById("body") на document.body.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 22:03
3000 руб./за проект
23 нояб. 2024, в 21:53
30000 руб./за проект
23 нояб. 2024, в 21:49
1000 руб./в час