Как увеличить идентификатор элемента jQuery - PullRequest
0 голосов
/ 28 января 2012

У меня есть экземпляры 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') и т. д.

Большое спасибо заранее.Примечание: я нуб.

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Проблема в том, что все эти функции "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 за эту заметку.)

Обратите внимание, что я объявил "i", используемый в цикле с var, чтобы сделать его локальным для "addPlayAudioMethodToExerciseArray" (мальчик, это длинное имя функции; я надеюсь, вам не придется вводить его слишком часто :-) , Кроме того, я использовал его в качестве числового индекса, предполагая, что «qaArray» - это действительно честный массив, а не просто n-объект. Рекомендуется использовать числовое индексирование для массивов.

0 голосов
/ 28 января 2012

использование окраски

попробуйте это:

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