2 回答

TA貢獻1864條經驗 獲得超6個贊
解決此問題的另一種方法是使用letinstead of var. let在循環范圍內創建一個變量,其中var將是一個全局變量,它將在每次迭代時被覆蓋。這意味著let您不會覆蓋該值,而是在每次迭代時創建一個新值,因此引用保持不變。
var buttonColours = ["red","blue","green","yellow"];
var sounds = [];
// Notice let i instead of var i.
for (let i = 0; i < buttonColours.length; i++) {
? $("." + buttonColours[i]).click(function(event) {
? ? // Add sound when button is clicked
? ? sounds[i] = new Audio("sounds/" + buttonColours[i] + ".mp3");
? ? sounds[i].play();
? ? // Add CSS class when button is clicked
? ? $(".red").addClass("pressed");
? ? setTimeout(function() {
? ? ? $(".red").removeClass("pressed");
? ? }, 200);
? });
}

TA貢獻1818條經驗 獲得超7個贊
由于點擊函數是一個回調,變量 i 可能在回調發生之前已經改變。所以你必須將 i 的值綁定到函數。試試這個:
var buttonColours = ["red", "blue", "green", "yellow"];
var sounds = [];
for (var i = 0; i < buttonColours.length; i++) {
? $("." + buttonColours[i] + "").click(function(i, event) { // OBSERVE i have added i as a parameter
? ? // Add sound when button is clicked
? ? sounds[i] = new Audio("sounds/" + buttonColours[i] + ".mp3");
? ? sounds[i].play();
? ? // Add CSS class when button is clicked
? ? $(".red").addClass("pressed");
? ? setTimeout(function() {
? ? ? $(".red").removeClass("pressed");
? ? }, 200);
? }.bind(this, i)); // OBSERVE I have added an i here
}
您在代碼中遇到的另一個問題是您尚未初始化聲音數組。我不認為它會出錯,所以我沒有更正它。
添加回答
舉報