Это потому, что li
относится к HTMLCollection <li>
элементов, а не отдельного элемента <li>
. Вам необходимо:
- использовать
li[i].classList
и - использовать
let
в течение l oop, из-за JS closure
Итак, у вас есть что-то вроде этого, при условии, что вы поддерживаете только браузеры, поддерживающие ES6:
const li = document.getElementsByTagName("li");
for (let i = 0; i < li.length; i++) {
const el = li[i];
el.addEventListener("click", () => {
el.classList.toggle("done");
});
}
В противном случае вам нужно будет использовать forEach
функция вместо Поскольку getElementsByTagName
не возвращает итератор, вам лучше использовать querySelectorAll
, для чего доступен метод forEach
:
var li = document.querySelectorAll('li');
li.forEach(function(el) {
el.addEventListener("click", function () {
el.classList.toggle("done");
});
});
См. Пример проверки концепции:
const li = document.getElementsByTagName("li");
for (let i = 0; i < li.length; i++) {
li[i].addEventListener("click", function() {
li[i].classList.toggle("done");
});
}
.done {
text-decoration: line-through;
}
<h1>Shopping List</h1>
<p id="first">Get it done today</p>
<input id="userinput" type="text" placeholder="enter items">
<button id="enter">Enter</button>
<ul>
<li class="bold red" random="23">Notebook</li>
<li>Jello</li>
<li>Spinach</li>
<li>Rice</li>
<li>Birthday Cake</li>
<li>Candles</li>
</ul>