Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何增加jQuery元素ID_Javascript_Jquery_Increment - Fatal编程技术网

Javascript 如何增加jQuery元素ID

Javascript 如何增加jQuery元素ID,javascript,jquery,increment,Javascript,Jquery,Increment,我有jPlayer(jqueryaudioplayer)的实例:jPlayer1、jPlayer2、jPlayer3、jPlayer4,每个都初始化并预加载了音频文件 调用下面的函数将遍历现有数组并添加播放预加载音频的方法 function addPlayAudioMethodToExerciseArray(){ for (i in qaArray){ qaArray[i].playAnswer = function(){ $('#jPlayer'+i).jPlayer(

我有jPlayer(jqueryaudioplayer)的实例:jPlayer1、jPlayer2、jPlayer3、jPlayer4,每个都初始化并预加载了音频文件

调用下面的函数将遍历现有数组并添加播放预加载音频的方法

function addPlayAudioMethodToExerciseArray(){
    for (i in qaArray){
        qaArray[i].playAnswer = function(){ $('#jPlayer'+i).jPlayer('play',0);}
    }
}  
它创建的方法正确,但零件(“#jPlayer”+i)未计算为(“#jPlayer1”)、(“#jPlayer2”)等

非常感谢。
注意:我是一个noob。

问题是所有这些“playAnswer”函数都围绕着同一个“I”变量。也就是说,只有一个“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);
    }
}
函数addPlayAudioMethodToExerciseArray(){
函数makePlayerCallback(一){
返回函数(){
$('#jPlayer'+i).jPlayer('play',0);
};
}
对于(变量i=0;i
“makePlayerCallback”函数有自己的参数“i”,该参数实际上是该函数的局部参数,将导致回调函数分别具有自己的“i”。对该函数的每次调用都会围绕返回的回调函数创建一个所谓的“闭包”。(请注意,我的循环从零开始;如果HTML中的标识符从1开始,则需要通过在某处添加1来说明这一点。感谢@DieVarDump的注释。)


注意,我用
var
声明了循环中使用的“I”,以使其成为“addPlayAudioMethodToExerciseArray”的本地名称(这是一个很长的函数名;我希望您不必经常键入:-)。此外,我将其用作数字索引,假设“QARRAY”实际上是一个诚实的gosh数组,而不仅仅是n对象。对数组使用数字索引是一种很好的做法。

使用colsures

试试这个:

    for(i in qaArray)
    {
        qaArray[i].playAnswer = function (num)
        {
            return function ()
            {
                $('#jPlayer' + num).jPlayer('play', 0);
            } ;
        }(i)
    };

对于那些新接触JavaScript的人来说,这是一个非常常见的陷阱。你能告诉我们什么包含qaArray吗?-在你的(QARRAY中的i)中,你的i开始为0,因此第一个'#jPlayer'+i将是'#jPlayer0'。。。这是不存在的。我还认为你必须添加一些闭包,否则我将永远是最后一个(qaArray.length-1)。原始代码具有if(i>0){//start traversing}。因此,是的,该方法是从qaArray[1]开始添加的。当“#jsPlayer1”是硬编码时,它会工作。当然,所有方法都会触发相同的jsPlayer1;如果ID真的从1开始(jPlayer1、jPlayer2、jPlayer3、jPlayer4),那么您必须调用makePlayerCallback(i+1);因为数组indexe从0console.debug开始,所以仍然显示:playAnswer:function(){$('#jPlayer'+i).jPlayer('play',0);}没关系,@10davvid-它是一个不同的“i”,因为有额外的函数调用(调用
makePlayerCallback()
)。抱歉,说得太早了。是的,它起作用了!这样就可以了,在运行时(调用该方法时)计算Id。谢谢大家@你们教我的函数可以返回函数。好的。现在代码运行得非常完美,我仍然无法理解它。如果console.debug显示:playAnswer:function(){$('#jPlayer'+i).jPlayer('play',0);},这意味着调用方法playAnswer时,我需要它的值,但到那时,再也没有包装它的i值了????对我来说似乎很神奇。有人能向一个6岁以上40岁的孩子解释吗?