2012-08-16 70 views
2

對不起,這可能是一個簡單的問題。我正在嘗試使用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'); 

「我」變量不能被看到。我已經通過插入我自己的變量來測試它,並且它可以工作。

有什麼建議嗎?

謝謝。

+1

你能「不能被視爲」詳細點嗎? – jli 2012-08-16 15:21:37

+2

如果將'for'語句更改爲'for(var i = 0; i <= 4; i ++)',該怎麼辦? – 2012-08-16 15:21:57

+1

在'i'前加'var',否則你只會得到最後一個值,因爲你的變量是全局變量 – nico 2012-08-16 15:22:22

回答

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爲循環的,因爲它要求每個數組索引的功能。

+0

完美。謝謝,我認爲這是一個範圍問題,但我認爲我自己爲自己複雜的事情。 – 2012-08-16 15:31:13

+0

不客氣。 – 2012-08-16 15:34:29

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