2015-10-16 74 views
0

好,只要...我想使這個(工作完美,但很明顯,當我有#B高達#B20太多的著作):for循環爲什麼不讓我的願望成真?

$("#b" + 1).click(function() { 
    $('.c').hide(); 
    $(".a" + 1).show(); 
}); 
$("#b" + 2).click(function() { 
    $('.c').hide(); 
    $(".a" + 1).show(); 
}); 

簡單,就像這樣:

for (var i = 0; i < 50; i += 1) { 
    $("#b" + i).click(function() { 
     $('.c').hide(); 
     $(".a" + i).show(); 
     alert('Hey'+i); 
    }); 
} 

$( 「#b」 + I)是htmlpage按鈕,$( 「一」 + I)是應該可以通過點擊該按鈕頁面上看到的文字。 //所以文本是class =「c a1」class =「c a2」,...;並且該按鈕與id =「#b1」,id =「#b2」 ... 但是,當我執行代碼(單擊#b1,#b2或...),.c隱藏(如預期的那樣),並且下一步僅在i = 50時執行(用警報證明)。

任何想法?

+0

b從0開始,你想要那個嗎?在你的第一行中,你說你只有#b沒有號碼。請澄清。 – ergonaut

+0

一個可能更簡潔的方法是隻給所有按鈕相同的類別(即「btn」),然後是一個具有實際數字的「data-num」屬性。然後你可以說'$(「.btn」)。click(function(){var i = $(this).data(「num」);/*其餘代碼* /});'。 – basilikum

回答

0

試試這個for循環:

for (var i = 0; i < 50; i += 1) { 
    (function (j) { 
     $("#b" + j).click(function() { 
      $('.c').hide(); 
      $(".a" + j).show(); 
      alert('Hey'+j); 
     }); 
    }(i)) 
} 

其實,這是一個典型的,你應該閱讀更多關於關閉和有關的事實,JS是一個「作爲傳遞價值」的語言。但是,簡單地說:

被作爲參數傳遞給click功能匿名function必須創建它在環境中的參考,併爲因此,具有參考i變量,而這恰恰是每創建function相同(每次迭代都會創建一個函數)。所以每個匿名函數都會有i和循環的最後一個值。

通過其他關閉,您使用JS傳遞參數的值,而不是引用的事實:j(即使你把它i,因爲我以前有)不爲i的引用,而是當它傳遞給函數時,它的值爲i

+0

是的,但*爲什麼*? – Bergi

+0

好的。對不起,有另一個問題的重複。 謝謝//因爲我爲這個問題奮戰了3天//。 –