2011-11-03 58 views
0

我有多個div,其中包含類似的代碼,但在主div中還有一個唯一的id,它調用toggleClass & slideToggle函數。我試圖創建一個循環,以便我不必爲每個元素編寫類似的代碼。while循環在動態id和類的jQuery中

---工作代碼---(其中數值後的ID會改變)

$('#er1').click(function() { 
    $('#er1').toggleClass('but-extra-on'); 
    $('#cr1').toggleClass('but-closerow-on'); 
    $('#er1').next('div').slideToggle('slow'); 
    return false; 
}); 

- 不工作密碼 - (我想爲#ER1的點擊功能,# ER2,ER3#等)

var count = 1; 
while (count < 10){ 
    var curER = 'er'+count; 
    var curCR = 'cr'+count; 
    $('#'+curER).click(function() { 
     $('#'+curER).toggleClass('but-extra-on'); 
     $('#'+curCR).toggleClass('but-closerow-on'); 
     $('#'+curER).next('div').slideToggle('slow'); 
    }); 
    count++; 
} 

*出於某種原因,當我使用的代碼時,每當我點擊#ER1,ER2#,#ER3等。僅#ER9切換事件。

+0

你可以發佈[JS小提琴演示](http://jsfiddle.net/)演示,顯示工作/非工作代碼?我假設'while'循環的最後一次迭代將一切設置爲'count'的最終值。 –

+1

可能重複[從Javascript關閉循環訪問外部變量](http://stackoverflow.com/questions/1331769/access-outside-variable-in-loop-from-javascript-closure)和[JavaScript內部循環閉包 - 簡單實用的例子](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

+0

問題是你已經在循環中聲明瞭curCR和curER。您需要將循環外的變量移動。 –

回答

2

就可以解決這個問題,通過使用$(本),選擇您所點擊的一個,並連接一個html數據:我通過提取事件偵聽器代碼到其自身的功能,像這樣固定它屬性的div,指定你想要改變的另一個div,當你點擊它並選擇另一個...有道理..可能不是?請參閱下面的解決方案1 ​​

第二個解決方案是使用jQuery Event Data將count變量傳遞給事件偵聽器。

解決方案1:http://jsfiddle.net/Es4QW/8/(這個醃您的HTML位)
解決方案2:http://jsfiddle.net/CoryDanielson/Es4QW/23/

我相信,第二個解決方案會更有效,因爲你有略少的HTML代碼,以及$(this)對象略小。創建地圖,並把它當作事件數據,我相信,是較​​不密集......可是現實......有沒有區別?the second solution has cleaner HTML code, so you should use that.

解決方案3 W/.slideToggle():http://jsfiddle.net/CoryDanielson/Es4QW/24/

編輯:通過傳入所選元素而不是選擇器來更新解決方案。現在每個點擊事件都不會像以前那樣進行DOM查找。

0

我以前遇到過這個問題。

for (var i = 1; i < 10; i++) { 
    attachClickEvent('er'+i, 'cr'+i); 
) 

function attachClickEvent(cr, er) 
{ 
    $('#'+er).click(function() { 
     $(this).toggleClass('but-extra-on'); 
     $('#'+cr).toggleClass('but-closerow-on'); 
     $(this).next('div').slideToggle('slow'); 
    }); 
}