如何在for循环中添加事件侦听器
How to add event listener inside a for loop?
由于某些原因,我需要循环浏览各种元素,并在单击它们时更改它们的样式。这是代码(https://jsfiddle.net/wd4z1kvs/1/)我正在尝试:
var myscroll = {};
myscroll.list = document.getElementsByClassName("navbar-right")[0].getElementsByTagName("li");
for( var j=0; j < 5; j++) {
myscroll.list[j].anchor = document.getElementsByClassName("navbar-right")[0].getElementsByTagName("li")[j].getElementsByTagName("a")[0];
myscroll.list[j].anchor.addEventListener("click", function() {
alert(j);
myscroll.list[1].anchor.innerHTML = "hello" + j;
myscroll.list[j].anchor.innerHTML = "yellow" + j;
});
}
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li class="active"><a href="#">Home</a></li>
<li><a href="#artists">Artists</a></li>
<li><a href="#songs">Songs</a></li>
<li><a href="#beats">Beats</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
问题似乎是该事件使用j
的当前值。当代码实际运行时,它不接受参数的值。
最简单的解决方案是使用forEach
或其他循环回调函数:
myscroll.list.forEach(function(item, j) {
item.anchor = document.getElementsByClassName("navbar-right")[0]
.getElementsByTagName("li")[j]
.getElementsByTagName("a")[0];
item.anchor.addEventListener("click", function() {
alert(j);
myscroll.list[1].anchor.innerHTML = "hello" + j;
item.anchor.innerHTML = "yellow" + j;
});
});
试试这个:
var myscroll = {};
myscroll.list = document.getElementsByClassName("navbar-right")[0].getElementsByTagName("li");
for( var j=0; j < 5; j++) {
(function(j) {
/* j variable is just a local copy of the j variable from your loop */
myscroll.list[j].anchor = document.getElementsByClassName("navbar-right")[0].getElementsByTagName("li")[j].getElementsByTagName("a")[0];
myscroll.list[j].anchor.addEventListener("click", function() {
alert(j);
myscroll.list[1].anchor.innerHTML = "hello" + j;
myscroll.list[j].anchor.innerHTML = "yellow" + j;
});
}(j));
}
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li class="active"><a href="#">Home</a></li>
<li><a href="#artists">Artists</a></li>
<li><a href="#songs">Songs</a></li>
<li><a href="#beats">Beats</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
正如@Andreas所注意到的,循环中有一个闭包。
事件不记得值,它们只保留一个链接(引用)创建它们的环境。在这种情况下,变量j碰巧生活在这三件事发生的环境中定义因此,所有事件,当它们需要访问价值时回到环境中,找到j的最新值循环中,j变量的值为5。因此,所有五个事件都指向相同的值。
使用这个:var myscroll={};
var list = document.getElementsByClassName("navbar-right")[0].getElementsByTagName("li");
myscroll.list = list;
for (var j = 0; j < 5; j++) {
var anchor = list[j].getElementsByTagName("a")[0];
anchor.setAttribute("index",j);
myscroll.list[j].anchor = anchor;
anchor.addEventListener("click", function () {
alert(this.getAttribute("index"));
this.innerHTML = "hello" + this.getAttribute("index");
//this.innerHTML = "yellow" + this.getAttribute("index");
this.style.backgroundColor = "yellow";
});
}
相关文章:
- 如何在for循环中添加事件侦听器
- 如果选中了多个复选框,如何添加事件
- 正在ng重复元素上添加事件
- 在动态创建的标记上添加事件
- 如何在HTML列表中添加事件's子弹
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- jQuery完整日历添加事件,仅包含月份和日期
- 是否可以在数字输入框中的小按钮中添加事件侦听器
- 在Google Chrome扩展中添加事件侦听器
- AngularJS:在.post()之后添加事件侦听器
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 添加事件侦听器不起作用
- 如何为angular js条形图添加事件
- 在 http 请求中添加事件侦听器 ( request.on ) 是什么意思?而笏就是它的用途
- Iron:路由器在更改路由器上添加事件
- 如何为表行结果的每个按钮添加事件侦听器
- 在 javascript 中添加事件处理程序的位置
- YouTube API-动态添加事件侦听器
- 在聚合物的子菜单标题中添加事件
- 检查是否可以添加事件侦听器而不添加