[英]Adding Event Listener to an array
Im trying to do homework assignment and confused why I'm getting error message(undefined is not an object (evaluating 'buttons[i].style')) any help appreciated Ive been trying to loop through the buttons array and add an Event Listener to each item in the list我正在尝试做家庭作业并困惑为什么我会收到错误消息(未定义不是对象(评估'buttons [i].style'))任何帮助表示赞赏我一直在尝试遍历按钮数组并添加一个事件侦听器到列表中的每个项目
var buttons = document.getElementsByClassName("quality");
for(var i = 0; i < buttons.length; i += 1){
buttons[i].addEventListener('click', function (i) {
buttons[i].style.background = "red";
});
}
<!doctype html>
<html>
<head>
<title>L.A. Hiking</title>
<link rel="stylesheet" href="css/hiking.css">
</head>
<ul id = "navbar">
<li><a href="index.html" class= "selected">Home</a></li>
<li><a href="contact.html">Contact</a></li>
<li><a href="about.html">About</a></li>
</ul>
<body>
<div>
<div class="blocks" id="selections">
<ul id= "attr1">
<li class="Instruction">Pick one:</li>
<li class ="quality">Hard</li>
<li class ="quality">Medium</li>
<li class ="quality">Easy</li>
</ul>
<ul id = "attr2">
<li class="Instruction">Pick one:</li>
<li class ="quality">Hard</li>
<li class ="quality">Medium</li>
<li class ="quality">Easy</li>
</ul>
<ul id = "attr3">
<li class="Instruction">Pick one:</li>
<li class ="quality">Hard</li>
<li class ="quality">Medium</li>
<li class ="quality">Easy</li>
</ul>
</div>
<div class="blocks" id="results">
<ul id = "choices">
<li class="choice">Pick one:</li>
<li class ="choice">Hard</li>
<li class ="choice">Medium</li>
</ul>
</div>
</div>
<div id="button-container">
<button>Go!</button>
</div>
<script src="javascript/hiking.js"></script>
</body>
</html>
The callback for addEventListener
doesn't give you the index of the button clicked but an event object. addEventListener
的回调不会给你点击按钮的索引,而是一个事件对象。 You can then access the button using event.target
:然后您可以使用
event.target
访问按钮:
for(var i = 0; i < buttons.length; i += 1){
buttons[i].addEventListener('click', function (e) {
e.target.style.background = "red";
});
}
since you are binding to the event to the object itself you could also use context aka this so e.target.style.background = "red";
由于您将事件绑定到对象本身,因此您也可以使用上下文即 this,因此 e.target.style.background = "red"; becomes this.style.background = "red";
变成 this.style.background = "red";
for(var i = 0; i < buttons.length; i += 1){
buttons[i].addEventListener('click', function () {
this.style.background = "red";
});
}
document.getElementsByClassName("quality");
returns the collection of all the elements matching the class name quality in a NodeList
object.返回与
NodeList
对象中的类名quality匹配的所有元素的集合。 From the code you posted, it seems that you are having the listitem
and not the button
element for the quality class name.从您发布的代码来看,您似乎拥有的是
listitem
而不是质量类名称的button
元素。
More importantly, the addEventListener
callback would pass in the event information in the parameter to the callback.更重要的是,
addEventListener
回调会将参数中的事件信息传递给回调。 The property event.target
returns the element on which the event was registered , which in this case is the listItem[i]
.属性
event.target
返回注册事件的元素,在本例中是listItem[i]
。 So, you need to use the e.target
as e.target.style.background = "red";
所以,你需要使用
e.target
作为e.target.style.background = "red";
var listItems = document.getElementsByClassName("quality"); for(var i = 0; i < listItems.length; i += 1){ listItems[i].addEventListener('click', function (e) { e.target.style.background = "red"; }); }
<html> <head> <title>LA Hiking</title> <link rel="stylesheet" href="css/hiking.css"> </head> <ul id = "navbar"> <li><a href="index.html" class= "selected">Home</a></li> <li><a href="contact.html">Contact</a></li> <li><a href="about.html">About</a></li> </ul> <body> <div> <div class="blocks" id="selections"> <ul id= "attr1"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> <ul id = "attr2"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> <ul id = "attr3"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> </div> <div class="blocks" id="results"> <ul id = "choices"> <li class="choice">Pick one:</li> <li class ="choice">Hard</li> <li class ="choice">Medium</li> </ul> </div> </div> <div id="button-container"> <button>Go!</button> </div> <script src="javascript/hiking.js"></script> </body> </html>
In addition to everyone suggesting attaching an event to each li.quality
element, you could also consider this pattern.除了每个人都建议为每个
li.quality
元素附加一个事件li.quality
,您还可以考虑这种模式。
You can attach one event to the parent element (instead of having an event listener for each li.quality
element) by taking advantage of Event Bubbling ( see SO post here ).您可以利用事件冒泡将一个事件附加到父元素(而不是为每个
li.quality
元素设置一个事件侦听器)( 请参阅此处的 SO 帖子)。
let selectionsElement = document.querySelector('#selections'); selectionsElement.addEventListener('click', function(event) { // stop event from bubbling further up the DOM tree event.stopPropagation(); /* the `this` keyword will refer to the #selections element so we can't use it with this approach so we'll have to use `event` */ // check if the element which triggered the event is li.quality if (event.target.classList.contains('quality')) { event.target.style.backgroundColor = 'red'; } });
<html> <head> <title>LA Hiking</title> <link rel="stylesheet" href="css/hiking.css"> </head> <ul id = "navbar"> <li><a href="index.html" class= "selected">Home</a></li> <li><a href="contact.html">Contact</a></li> <li><a href="about.html">About</a></li> </ul> <body> <div> <div class="blocks" id="selections"> <ul id= "attr1"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> <ul id = "attr2"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> <ul id = "attr3"> <li class="Instruction">Pick one:</li> <li class ="quality">Hard</li> <li class ="quality">Medium</li> <li class ="quality">Easy</li> </ul> </div> <div class="blocks" id="results"> <ul id = "choices"> <li class="choice">Pick one:</li> <li class ="choice">Hard</li> <li class ="choice">Medium</li> </ul> </div> </div> <div id="button-container"> <button>Go!</button> </div> <script src="javascript/hiking.js"></script> </body> </html>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.