我在想這裏有一些基本的東西,迭代時將變量賦值給DOM事件偵聽器
for (var i=1; i<=5; i++) {
var o = $('#asd'+i);
o.mouseover(function() {
console.info(i);
});
}
當鼠標懸停在五個不同的元素,我總是走不出從一個迭代的最後一個值;價值5
。我想要的是不同的值,取決於我徘徊的元素,全部從1
到5
。
我在這裏做錯了什麼?
我在想這裏有一些基本的東西,迭代時將變量賦值給DOM事件偵聽器
for (var i=1; i<=5; i++) {
var o = $('#asd'+i);
o.mouseover(function() {
console.info(i);
});
}
當鼠標懸停在五個不同的元素,我總是走不出從一個迭代的最後一個值;價值5
。我想要的是不同的值,取決於我徘徊的元素,全部從1
到5
。
我在這裏做錯了什麼?
你需要關閉,因爲所有的鼠標懸停功能的引用相同的變量,其值正在改變:
for (var i=1; i<=5; i++) {
(function(j) {
$('#asd'+j).mouseover(function() {
console.info(j);
});
})(i);
}
通過創建一個封閉的可變j
是函數的局部範圍內,將當「外部」i
更改時不會更改。
你需要用更多的閉包你的函數調用:
我認爲這應該工作:
for (var i=1; i<=5; i++) {
var o = $('#asd'+i);
(function(j){
o.mouseover(function(){
console.info(j);
});
})(i);
}
在這種情況下i
是一個封閉的內部約束在每次迭代中,意味着添加到對象的所有函數都指向相同的變量,並且由於此變量在每次迭代時都增加,所有函數都引用最後遞增的值。
避免這個問題的方法是通過值複製到一個新的變量瓶蓋內
for (var i=1; i<=5; i++) {
var o = $('#asd'+i);
(function(newi) {
o.mouseover(function() {
console.info(newi);
});
}(i);
}
有確實有些基本的東西我是缺少:-)感謝一大堆! – ptrn 2010-06-01 19:42:07
這節省了我的一天。真正重要的是要知道。謝謝! – BobuSumisu 2012-08-17 14:47:49