2016-09-01 47 views
0

我有一個對象(玩家)的數組,並且這些對象有一個方法increment遞增一個對象變量。未捕獲的類型錯誤裏面的循環

裏面一個for循環,當我打電話 players[x].increment();我得到以下錯誤:

intex.html:56 Uncaught TypeError: Cannot read property 'increment' of undefined

for (var x = 0; x < players.length; x++) { 
    $("#button-" + x).click(function() { //I select one of the buttons 
     players[x].increment(); //Here is the problem 
     //This part forwards doesn't matter 
     $("#score-" + x + "-n").text(players[x].score); 
     if (players[x].score >= 10) { 
      alert(players[x].name + " WINS!"); 
      $("#alertz").html('<div class="alert alert-info" style="text-align:center;" >' + players[x].name + 'WINS!!!</div>'); 
     }; 
    }); 
}; 

當我打電話例如players[0].increment();循環外,我沒有任何問題。

萬一不明確。我有一個簡單的頁面,有兩個按鈕。根據我按下的按鈕,它會遞增並顯示一個變量。

當我在increment部分使用console.log(var)時,我得到一個2,但players[2]不存在,所以我認爲這是問題,但我不確定或如何解決它。

+3

[添加「點擊」的循環事件偵聽器]的可能的複製(http://stackoverflow.com/questions/8909652/adding- click-event-listeners-in-loop),或者甚至更好的dup:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – Teemu

+1

當你點擊按鈕時, 'x'等於'players.length',它比'player'對象的數量多。您必須將x綁定到該函數,以這種方式引用只會爲所有點擊事件生成最後一個x值。 –

+0

你不需要在循環中點擊事件..那是不正確 – bipen

回答

0

當點擊事件觸發時,您的迭代器等於players.length,然後click處理程序使用該迭代器嘗試訪問您的玩家數組超出範圍的索引。

嘗試將索引屬性上的按鈕,這樣,而不是:

<button class="player-button" data-player-index="0">Increment</button> 
<button class="player-button" data-player-index="1">Increment</button> 

$('.player-button').click(function() { 
    var index = $this.attr('data-player-index'); 
    players[index].increment(); 
}); 
+0

謝謝!我是前端新手,但事實上,將click事件放在for循環中是愚蠢的。 –