我有jPlayer(jquery音频播放器)的实例:jPlayer1,jPlayer2,jPlayer3,jPlayer4,每个都初始化并预装了音频文件。
下面的调用函数将遍历现有数组并添加播放预加载音频的方法。
function addPlayAudioMethodToExerciseArray(){
for (i in qaArray){
qaArray[i].playAnswer = function(){ $('#jPlayer'+i).jPlayer('play',0);}
}
}
它创建方法正常,除了部分('#jPlayer'+ i)未被评估为('#jPlayer1'),('#jPlayer2')等。
非常感谢提前。 注意:我是菜鸟。
答案 0 :(得分:2)
问题是所有那些“playAnswer”函数都包含在同一个“i”变量中。也就是说,只有一个“我”(在这种情况下,由于你没有用var
声明它,它是全局的!)。
您需要做的是使用另一个函数为每个回调提供单独的“i”。
function addPlayAudioMethodToExerciseArray(){
function makePlayerCallback(i) {
return function() {
$('#jPlayer' + i).jPlayer('play', 0);
};
}
for (var i = 0; i < qaArray.length; ++i){
qaArray[i].playAnswer = makePlayerCallback(i);
}
}
“makePlayerCallback”函数有自己的参数“i”,它实际上是 函数的本地参数,将导致回调函数分别拥有自己的“i”。每次调用该函数都会在返回的回调函数周围创建所谓的“闭包”。 (请注意,我的循环从零开始;如果HTML中的标识符从1开始,则需要通过在某处添加1来解释该问题。感谢@DieVarDump获取该说明。)
请注意,我在循环中使用var
声明“i”使其成为“addPlayAudioMethodToExerciseArray”的本地(男孩,这是一个很长的函数名称;我希望你不必经常输入它: - )。另外,我使用它作为数字索引,假设“qaArray”实际上是一个诚实的gosh数组,而不仅仅是n个对象。对数组使用数字索引是一种很好的做法。
答案 1 :(得分:0)
使用 colsures
试试这个:
for(i in qaArray)
{
qaArray[i].playAnswer = function (num)
{
return function ()
{
$('#jPlayer' + num).jPlayer('play', 0);
} ;
}(i)
};