变量无法看到

时间:2012-08-16 15:19:56

标签: javascript jquery closures

抱歉,这可能是一个简单的问题。我正在尝试使用jQuery构建我的第一个导航。这个想法是,在按钮悬停时,只要不是“选中”按钮,背景颜色和文本颜色就会改变。除了文字颜色外,我所有这一切都很好。就像在jQuery中一样,它无法看到我的循环变量:

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'变量。我已经通过插入自己的变量进行了测试,但它确实有效。

有什么建议吗?

感谢。

2 个答案:

答案 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);
    });
}