首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >未捕获TypeError:无法读取未定义的属性“”classList“”-正在尝试切换JS中的类

未捕获TypeError:无法读取未定义的属性“”classList“”-正在尝试切换JS中的类
EN

Stack Overflow用户
提问于 2018-02-26 13:56:44
回答 2查看 2.5K关注 0票数 1

我只是简单地尝试通过单击一个任务列表应用程序来打开和关闭一个类,我只是使用vanilla JS创建的(没有jQuery)。我遗漏了什么或做错了什么?下面是我现在拥有的代码

HTML

代码语言:javascript
代码运行次数:0
运行
复制
<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

代码语言:javascript
代码运行次数:0
运行
复制
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‘”

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-02-26 14:00:20

您的代码中有两个问题。

  1. 而不是getElementByTagName,应该是getElementsByTagName

li = document.getElementsByTagName("li")

  • Inside定义在li元素上的事件处理程序,您可以使用this而不是li[i]来引用li元素。

基本上,问题是i是由for循环递增的,当单击处理程序实际执行时,i的值为3。因此,引用li[i]是错误的,因为只有三个li元素(因此直到li[2]).

以下是更新后的代码片段:

代码语言:javascript
代码运行次数:0
运行
复制
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");
  })
}
代码语言:javascript
代码运行次数:0
运行
复制
.done {
  color: red;
}
代码语言:javascript
代码运行次数:0
运行
复制
<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。但请注意,它不能与较旧的浏览器一起工作。

代码语言:javascript
代码运行次数:0
运行
复制
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");
  })
}
代码语言:javascript
代码运行次数:0
运行
复制
.done {
  color: red;
}
代码语言:javascript
代码运行次数:0
运行
复制
<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>

票数 0
EN

Stack Overflow用户

发布于 2018-02-26 14:01:54

scope/value of i是问题所在。当单击该元素时,由于i++i的值将递增到3(在本例中)。您可以使用let而不是var

代码语言:javascript
代码运行次数:0
运行
复制
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");
  })
  
}
代码语言:javascript
代码运行次数:0
运行
复制
.done{
color:red;
}
代码语言:javascript
代码运行次数:0
运行
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48982274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档