请帮我修复此代码
HTML
<p class="imgclass">Test1</p>
<p class="imgclass">Test2</p>
<p class="imgclass">Test3</p>
的JavaScript
imgclassElements = document.getElementsByClassName('imgclass');
for (var i = 0; i < imgclassElements.length; i++){
imgclassElements[i].onmouseover=function(){alert(i);};
}
在浏览器onmouseover
中,类.imgclass
的元素仅显示警告框,文字为“3”。如何修复这个?我想弹出警报窗口,其中包含适当的.imgclass
元素顺序值。
答案 0 :(得分:1)
这是最简单的方法,你可以使用一个闭包,但我会保持简单。您还可以访问元素并应用样式,或从单击处理程序中获取信息
<强> FIDDLE 强> http://jsfiddle.net/bz7a2vf5/1/
<强> HTML 强>
<p id="item1" class="imgclass">Test1</p>
<p id="item2" class="imgclass">Test2</p>
<p id="item3" class="imgclass">Test3</p>
<强> JS 强>
imgclassElements = document.getElementsByClassName('imgclass');
for (var i = 0; i < imgclassElements.length; i++) {
click(i);
}
function click(i){
imgclassElements[i].onmouseover = function (e) {
// you can also get the element from e.target
alert(i);
alert(e.target.id);
};
}
答案 1 :(得分:0)
这可能不是最优雅的方式,但
imgclassElements[i].addEventListener('mouseover',function(j){return function(){alert(j);};}(i));
应该这样做。
那就是说,你应该按照你的问题的评论中的建议阅读JS闭包。
答案 2 :(得分:0)
由于时间alert
被调用,问题正在发生,i
的值增加到3
,这就是为什么它会给{{1}每一次。
尝试使用当前值3
绑定一个函数,如下面的
i
也可以有更好的解决方案。
答案 3 :(得分:0)
最简单的方法是在函数中提取循环内容
function handleElement(element, i) {
element.onmouseover=function(){alert(i);};
};
for (var i = 0; i < imgclassElements.length; i++){
handleElement(imgclassElements[i], i);
}
或者你可以使用forEach(遗憾的是它是一个HTMLCollection而不是数组,所以它有点困难)
Array.prototype.forEach.call(imgclassElements, function(element, i) {
element.onmouseover=function(){alert(i);};
});
或者将索引作为参数
for (var i = 0; i < imgclassElements.length; i++){
imgclassElements[i].onmouseover=(function(i){alert(i);}).bind(null, i);
}
了解闭包总是一件好事