简体   繁体   English

Classlist 方法给出 typeerror

[英]Classlist method gives typerror

So I'm trying to make a simple to do list and I'm trying select all the li tags so when clicked on the li tag it would cross it out and display a check mark But I get an error saying Uncaught TypeError: Cannot read properties of undefined (reading 'add') at check (script.js:11:18) at HTMLLIElement.onclick (index.html:12:33)因此,我正在尝试制作一个简单的待办事项列表,并且我正在尝试选择所有 li 标签,因此当单击 li 标签时,它会将其划掉并显示一个复选标记但我收到一条错误消息,提示 Uncaught TypeError: Cannot read在 HTMLLIElement.onclick (index.html:12:33) 检查 (script.js:11:18) 时未定义的属性(读取“添加”)

 const addBtn = document.getElementById("addBtn"); const inputEl = document.getElementById("myInput"); const li = document.getElementsByClassName("li") addBtn.addEventListener("click", () => { myUl.innerHTML += `<li>${inputEl.value}</li>` }) check = () => { li.classList.add("checked") }
 * { box-sizing: border-box; } /* Remove margins and padding from the list */ ul { margin: 0; padding: 0; } /* Style the list items */ ul li { cursor: pointer; position: relative; padding: 12px 8px 12px 40px; background: #eee; font-size: 18px; transition: 0.2s; /* make the list items unselectable */ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } /* Set all odd list items to a different color (zebra-stripes) */ ul li:nth-child(odd) { background: #f9f9f9; } /* Darker background-color on hover */ ul li:hover { background: #ddd; } /* When clicked on, add a background color and strike out text */ ul li.checked { background: #888; color: #fff; text-decoration: line-through; } /* Add a "checked" mark when clicked on */ ul li.checked::before { content: ''; position: absolute; border-color: #fff; border-style: solid; border-width: 0 2px 2px 0; top: 10px; left: 16px; transform: rotate(45deg); height: 15px; width: 7px; } /* Style the close button */ .close { position: absolute; right: 0; top: 0; padding: 12px 16px 12px 16px; } .close:hover { background-color: #f44336; color: white; } /* Style the header */ .header { background-color: #f44336; padding: 30px 40px; color: white; text-align: center; } /* Clear floats after the header */ .header:after { content: ""; display: table; clear: both; } /* Style the input */ input { margin: 0; border: none; border-radius: 0; width: 75%; padding: 10px; float: left; font-size: 16px; } /* Style the "Add" button */ #addBtn { padding: 10px; width: 25%; background: #d9d9d9; color: #555; float: left; text-align: center; font-size: 16px; cursor: pointer; transition: 0.3s; border-radius: 0; } .addBtn:hover { background-color: #bbb; }
 <h2>My To Do List</h2> <input type="text" id="myInput"> <span id="addBtn">Add</span> <link rel="stylesheet" href="index.css"> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> </div> <ul id="myUL"> <li onclick="check()">Hit the gym</li> <li class="checked">Pay bills</li> <li onclick="check()">Meet George</li> <li onclick="check()">Buy eggs</li> <li onclick="check()">Read a book</li> <li onclick="check()">Organize office</li> </ul> <script src="script.js"> </script>

getElementsByClassName() returns a node list (collection) of matching elements. getElementsByClassName()返回匹配元素的节点列表(集合)。 classList is a property of a single element. classList是单个元素的属性。 In order to use it, you must call it on one element only.为了使用它,您必须仅在一个元素上调用它。

Alternatives:备择方案:

  1. Use .querySelector(.[className]) to return the first element that matches the selector.使用.querySelector(.[className])返回与选择器匹配的第一个元素。
  2. Access one of the collection items by passing an index ( li[0] ).通过传递索引 ( li[0] ) 访问其中一个集合项。
  3. Loop over the collection and call classList on each item as you loop.循环遍历集合并在循环时对每个项目调用 classList。

Also, don't use .getElementsByClassName() in the first place as it returns a "live node list" that causes performance issues.另外, 首先不要使用.getElementsByClassName()因为它会返回导致性能问题的“活动节点列表”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM