【发布时间】:2016-03-29 11:57:14
【问题描述】:
HTML
<span class="char" id="0">?</span>
<span class="char" id="1">!</span>
<span class="char" id="2">"</span>
<span class="char" id="3">/</span>
<span class="char" id="4">%</span>
<span class="char" id="5">$</span>
...
JavaScript
var charElems = document.getElementsByClassName('char');
for (var i=0; i < charElems.length; i++) {
charElems[i].addEventListener('mouseover',function() {
(function(j) {mouseoverCheck(j);}(i));
});
}
我有一堆(数百个)span 元素,其 ID 为数字(从 0 开始并以 1 递增)。这个循环应该做的是为所有span 元素(它们都有一个char 类)创建鼠标悬停事件侦听器。一旦鼠标悬停,它应该执行mouseoverCheck() 函数并传入任何i 在创建事件侦听器时的值。所以第 203 个事件监听器应该传入203。但事实并非如此。现在,它传入了我认为i 在循环完成之前的最后一个值。
我试图使用 IIFE 和闭包来确保每个事件侦听器在创建时获得 i 的值,而不是在调用函数时获得它的值。显然,我没有正确地做到这一点,但我相当肯定关闭是我问题的关键。任何人都可以阐明如何正确执行此操作吗?我以为我理解了闭包,但显然我不...
【问题讨论】:
-
如果您真正需要的只是索引号,我不会使用闭包。我只是将索引直接放在 DOM 元素上:
charElems[i].__index = i;,然后使用mouseoverCheck(this.__index)
标签: javascript for-loop closures addeventlistener