我只是简单地尝试通过单击一个任务列表应用程序来打开和关闭一个类,我只是使用vanilla JS创建的(没有jQuery)。我遗漏了什么或做错了什么?下面是我现在拥有的代码
HTML
<div id="container">
<h1> Todo List </h1>
<input type="text" placeholder="New todo">
<ul>
<li> item 1</li>
<li> item 2 </li>
<li> item 3 </li>
</ul>
</div>
JS
var h1 = document.querySelector("h1")
var li = document.getElementByTagName("li")
for ( var i = 0 ; i < li.length ; i++){
li[i].addEventListener("click", function(){
li[i].classList.toggle("done");
})
}
当我单击列表中的一项时,它在控制台中显示此错误-“未捕获TypeError:无法读取未定义的属性'classList‘”
我做错了什么?
发布于 2018-02-26 14:00:20
您的代码中有两个问题。
getElementByTagName
,应该是getElementsByTagName
:li = document.getElementsByTagName("li")
li
元素上的事件处理程序,您可以使用this
而不是li[i]
来引用li
元素。基本上,问题是i
是由for
循环递增的,当单击处理程序实际执行时,i
的值为3。因此,引用li[i]
是错误的,因为只有三个li
元素(因此直到li[2]
).
以下是更新后的代码片段:
var h1 = document.querySelector("h1")
var li = document.getElementsByTagName("li")
for (var i = 0; i < li.length; i++) {
li[i].addEventListener("click", function() {
this.classList.toggle("done");
})
}
.done {
color: red;
}
<div id="container">
<h1> Todo List </h1>
<input type="text" placeholder="New todo">
<ul>
<li> item 1</li>
<li> item 2 </li>
<li> item 3 </li>
</ul>
</div>
响应注释中的ikrabbe,您可以使用let
关键字let i = 0
在本地范围内创建索引变量i
。但请注意,它不能与较旧的浏览器一起工作。
var h1 = document.querySelector("h1")
var li = document.getElementsByTagName("li")
for (let i = 0; i < li.length; i++) {
li[i].addEventListener("click", function() {
li[i].classList.toggle("done");
})
}
.done {
color: red;
}
<div id="container">
<h1> Todo List </h1>
<input type="text" placeholder="New todo">
<ul>
<li> item 1</li>
<li> item 2 </li>
<li> item 3 </li>
</ul>
</div>
发布于 2018-02-26 14:01:54
scope/value of i
是问题所在。当单击该元素时,由于i++
,i
的值将递增到3(在本例中)。您可以使用let
而不是var
var h1 = document.querySelector("h1")
var li = document.getElementsByTagName("li")
for (let i = 0; i < li.length; i++) {
li[i].addEventListener("click", function() {
// console.log(i) // will log i =3 if let is replaced by var
li[i].classList.toggle("done");
})
}
.done{
color:red;
}
<div id="container">
<h1> Todo List </h1>
<input type="text" placeholder="New todo">
<ul>
<li> item 1</li>
<li> item 2 </li>
<li> item 3 </li>
</ul>
</div>
https://stackoverflow.com/questions/48982274
复制相似问题