为什么在Javascript中使用闭包时mouseover事件不起作用?
Why doesn't the mouseover event work when use closure in Javascript?
我有以下代码
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
</ul>
var lists = document.getElementsByTagName("li");
for(var i=0, len = lists.length; i< len; i++){
lists[i].onmouseover = function(){
console.log(i);
}(i);
}
预期结果:当鼠标在每个li
上时,我在控制台上得到0或1或2或3,但我只在刷新页面时得到这些数字,而不是在mouseover
中,有人知道为什么吗?
函数表达式后的"调用括号" (i)
立即执行函数,并将其返回值赋值为事件处理程序(即undefined
)。下面是一个函数声明的例子,希望它更容易理解:
function foo(i) {
console.log(i);
}
// in the loop
lists[i].onmouseover = foo(i);
查看如何调用foo
并将返回值赋给lists[i].onmouseover
?
必须从立即调用的函数表达式返回一个函数:
lists[i].onmouseover = (function(i){
return function() {
console.log(i);
};
}(i));
或与函数声明一起使用:
function createHandler(i) {
return function() {
console.log(i);
};
}
// in the loop
lists[i].onmouseover = createHandler(i);
更多信息:JavaScript闭包内部循环-简单的实际例子
相关文章:
- jQuery与导航菜单上的mouseover事件冲突.
- Vanilla Js:在一个事件中开始一段时间的循环,然后用第二个事件打破它?('mouseover'启
- mouseover,out and click事件不适用于折线
- Mouseover,Mouseout事件未在IE中启动
- Javascript-mouseover/out事件同时在所有同级元素上触发
- '李'mouseover事件被child'a'元素显示块
- Mouseover和Mouseout之间的事件顺序
- 使用jQuery将mouseover事件传递给另一个
- 数据映射:如何在mouseover上显示弹出窗口并自定义mouseover事件侦听器
- 如何在asp.net c#中显示和隐藏mouseover和mouseout事件的标签
- 在循环内部应用mouseover事件侦听器
- 如果child被悬停在mouseover上,jQuery on mouseover事件将再次触发
- 如何使用javascript/jquery从各处禁用mouseover事件
- 使用javascript mouseover事件调用CSS3悬停效果
- 为什么在Javascript中使用闭包时mouseover事件不起作用?
- 搜索框mouseenter和mouseover事件不能与scrollTop事件一起使用
- 如何在jQuery中延迟mouseover事件
- 如何仅当鼠标悬停在某个元素上至少1秒时才触发mouseover事件
- 如何使span标记的背景色仅在mouseover事件中显示
- 在mouseover事件上播放声音文件