#javascript #for-loop #iterator
#javascript #for-loop #итератор
Вопрос:
Мне трудно понять, почему мой код выполняется только один раз. Я могу щелкнуть первый появившийся квадрат, и класс изменится, но, похоже, на этом он останавливается. Я пытаюсь иметь возможность нажимать на квадраты, чтобы появлялись новые и так далее. Я не могу щелкнуть по второму созданному квадрату. Я зарегистрировал «totalSquares.длина», а также «i». «i», похоже, меньше длины totalSquares, поэтому я не уверен, почему мой цикл останавливается. У меня также есть ссылка на Codepen здесь. Заранее благодарю вас. Дайте мне знать, если вам понадобятся дополнительные разъяснения.
HTML:
<body>
<h1>Test
<br>
Your
<br>
Aim
</h1>
<p>Score: </p><span id="score">0</span>
<div id="container">
<div id="square"></div>
</div>
<script src="script.js"></script>
</body>
JS:
let totalSquares = [];
const squares = document.getElementById("square");
const totalScore = document.getElementById("score");
const heading = document.querySelector("h1");
let score = 0;
totalSquares.push(squares);
for (var i = 0; i < totalSquares.length; i ) {
totalSquares[i].addEventListener("click", function() {
createSquare();
this.classList.add("clicked");
score ;
totalScore.innerHTML = score;
console.log(totalSquares.length, i);
});
}
function createSquare() {
let div = document.createElement('div');
div.setAttribute("id", "square");
document.getElementById("container").appendChild(div);
totalSquares.push(div);
}
Комментарии:
1. Ваш цикл выполняется только один раз. В нем нет ничего,
createSquare
что указывало бы добавить прослушиватель событий в новый квадрат.
Ответ №1:
document.getElementById
возвращает только 1 элемент.
Итак, вы помещаете один элемент ( squares
) в array ( totalSquares
) .
Итак, похоже totalSquares.length
, что время выполнения цикла for должно быть равно 1.
Если у вас есть несколько элементов с идентификатором square
, вместо этого дайте им класс square
и получите все элементы document.querySelectorAll
таким образом:
const squares = document.querySelectorAll('.square');
Ответ №2:
Спасибо вам, ребята, за ответы. Я получил некоторую помощь, и приведенный ниже код выполняет то, чего я пытаюсь достичь.
const squares = document.getElementById("square");
const totalScore = document.getElementById("score");
let score = 0;
function createSquare() {
let div = document.createElement('div');
div.setAttribute("id", "square");
div.addEventListener("click", function() {
this.classList.add("clicked");
score ;
totalScore.innerHTML = score;
createSquare();
});
document.getElementById("container").appendChild(div);
}
createSquare();
Вместо использования цикла for они предложили мне поместить EventListener непосредственно в функцию createSquare, чтобы это помещало EventListener прямо в квадрат.