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
}
您在代码中遇到的另一个问题是您尚未初始化声音数组。我不认为它会出错,所以我没有更正它。
添加回答
举报