简体   繁体   中英

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)

 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. classList is a property of a single element. 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.
  2. Access one of the collection items by passing an index ( li[0] ).
  3. Loop over the collection and call classList on each item as you loop.

Also, don't use .getElementsByClassName() in the first place as it returns a "live node list" that causes performance issues.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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