简体   繁体   English

未捕获的TypeError:button.addEventListener不是函数

[英]Uncaught TypeError: button.addEventListener is not a function

I am learning js on my own and I am new in programming. 我正在自己学习js,并且是编程的新手。 I am stuck on the below code and any help will be much appreciated: 我坚持下面的代码,任何帮助将不胜感激:

<div id="container">
  <h1>To-Do list</h1>
  <input type="text">
  <ul>
    <li><span>X</span> one</li>
    <li><span>X</span> two</li>
    <li><span>X</span> three</li>
  </ul>
</div>

Javascript part: Javascript部分:

let li = document.getElementsByTagName("li");

let button = document.getElementsByTagName("span");

button.addEventListener("click", function() {
  console.log("clicked");
})

This throwing an error saying that it is not a function. 这抛出一个错误,表明它不是函数。 Where is my mistake? 我的错误在哪里?

The function Element.getElementsByTagName() returns a HTMLCollection of elements, you need to loop over it to bind the events. 函数Element.getElementsByTagName()返回元素的HTMLCollection,您需要对其进行循环以绑定事件。

 let li = document.getElementsByTagName("li"); let buttons = document.getElementsByTagName("span"); Array.from(buttons).forEach(b => { b.addEventListener("click", function() { console.log("clicked"); }); }); 
 <div id="container"> <h1>To-Do list</h1> <input type="text"> <ul> <li><span>X</span> one</li> <li><span>X</span> two</li> <li><span>X</span> three</li> </ul> </div> 

getElementsByTagName returns a list of elements getElementsByTagName返回元素列表

we can addEventListener on every element 我们可以在每个元素上添加eventListener

 let li = document.getElementsByTagName("li"); let button = document.getElementsByTagName("span"); console.log(button); // list of elements // and we have to addEventListener on every element Array.prototype.map.call(button, (b) => { b.addEventListener("click", function() { console.log("clicked"); }) }) 
 <div id="container"> <h1>To-Do list</h1> <input type="text"> <ul> <li><span>X</span> one</li> <li><span>X</span> two</li> <li><span>X</span> three</li> </ul> </div> 

Or we can addEventListener on parent element ( ul for example): 或者我们可以addEventListener父元素(在ul为例):

document.querySelector('ul').addEventListener("click", function(e) {
  console.log(e.target); // this will helps us to figure out on what exact element a click was made
  console.log("clicked");
})

You could just iterate over the buttons like so: 您可以像这样遍历按钮:

let li = document.getElementsByTagName("li");

let buttons = document.getElementsByTagName("span");

[].forEach.call(buttons, function(button) {
    button.addEventListener("click", function() {
        console.log("You clicked!");
    });
});

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

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