function testIndex(navIndex){
for(i=0; i<=4; i++){
if(i != navIndex){
$('#nav a:eq('+i+')').hover(function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color','#ff3520');
$('#nav li:eq('+i+')').css('color', '#ffffff');
}).fadeTo('fast', 1);
},
function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color', '#e8e8e8');
$('#nav li:eq('+i+')').css('color', '#ff3520');
}).fadeTo('fast', 1);
});
};
};
};
在
上$('#nav li:eq('+i+')').css('color', '#ff3520');
无法看到'i'变量。我已经通过插入自己的变量进行了测试,但它确实有效。
有什么建议吗?
感谢。
答案 0 :(得分:5)
因为你处于一个循环中,需要一个变量范围来保持对处理程序中i
的引用。
function testIndex(navIndex){
$.each(Array(5), function(i) {
if(i != navIndex){
$('#nav a:eq('+i+')').hover(function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color','#ff3520');
$('#nav li:eq('+i+')').css('color', '#ffffff');
}).fadeTo('fast', 1);
},
function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color', '#e8e8e8');
$('#nav li:eq('+i+')').css('color', '#ff3520');
}).fadeTo('fast', 1);
});
}
});
}
在JavaScript中调用函数会产生一个变量作用域,因此我使用$.each
作为循环,因为它为每个数组索引调用函数。
答案 1 :(得分:1)
已经解释了您的代码存在的问题(i
的范围)和解决方案。另请查看此相关问题:JavaScript closure inside loops – simple practical example。
然而,您可以采用不同的方式解决它,而不是使用索引,而是使用DOM遍历,以更面向jQuery的方式。我假设您的HTML看起来与此类似:
<ul id="#nav">
<li><a>...</a></li>
<li><a>...</a></li>
</ul>
即。 a
元素是您要更改的li
的后代。
然后您可以使用以下代码实现相同的目标:
function testIndex(navIndex){
$('#nav a').slice(0,5).not(function(i) {
return i === navIndex;
}).hover(function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color','#ff3520')
.closest('li').css('color', '#ffffff');
}).fadeTo('fast', 1);
}, function(){
$(this).fadeTo('fast', 0.3, function(){
$(this).css('background-color', '#e8e8e8');
.closest('li').css('color', '#ff3520');
}).fadeTo('fast', 1);
});
}