Получение значений в функции обратного вызова jquery - PullRequest
0 голосов
/ 09 марта 2011

Я использую метод jQuery animate, в котором я хочу вызвать функцию после завершения анимации. Поскольку функция вызывается несколько раз в цикле, мне нужно получить доступ к некоторой переменной, но я не знаю, как это сделать (я думаю, что-то делать с замыканиями).

У меня есть:

while (i<numberofTimeIntervals)
{   
     // some calculations here
     xPos = initialPosX + x + "px";
     yPos = initialPosY - y + "px";

     $("#object").animate({left: xPos},10).animate({top: yPos},10, function(){ console.log(xPos) });  <-- what I want here is the access to xPos and yPos

     i = i + 1;
}

Так что мне нужно иметь доступ к xPos и ​​yPos в то время, когда он рассчитывается как обратный вызов, вызываемый позднее.

JD.

Ответы [ 5 ]

3 голосов
/ 09 марта 2011

Использовать второе закрытие:

while(i<numberofTimeIntervals)
{
    var xPos = initialPosX + x + "px";
    var yPos = initialPosY - y + "px";

    (function(xPos) {
        $('#object').animate({left: xPos},10).animate({top: yPos},10, function(){  console.log(xPos) });
    })(xPos);

    i++;
}

Объяснение: JavaScript не имеет области видимости блока, только область действия функции.Таким образом, закрытие вашей функции обратного вызова сохраняет переменную (а не ее значение) xPos.Таким образом, в конце цикла сохраненная переменная, которая совпадает с переменной цикла, имеет окончательное значение.Оборачивая вызов в анонимную функцию, которая получает переменную, переданную в качестве аргумента, она теперь сохраняется как новая переменная, которая больше не будет изменяться.


Кстати, если у вас был доступ к JavaScript 1.7к сожалению, только несколько браузеров поддерживают его) вы также можете использовать let xPos вместо var xPos, чтобы переместить его в область видимости блока.

1 голос
/ 09 марта 2011

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

while (i<numberofTimeIntervals) {   

   //<!-- some calculations here--->

   (function(){
       var 
          xPos = initialPosX + x + "px",
          yPos = initialPosY - y + "px";

       $("#object")
          .animate({left: xPos},10)
          .animate({top: yPos},10, function(){  console.log(xPos) });  
       //<-- what I want here is the access to xPos and yPos

   })();

   i = i + 1;
}
0 голосов
/ 09 марта 2011

Я заставил его работать следующим образом: http://jsfiddle.net/gailbear/WbNdx/6/

function printme(xpos){
    console.log(xpos);
}

while (i < numberofTimeIntervals) {

    var xPos = initialPosX + x + "px";
    var yPos = initialPosY - y + "px";

    $("#object").animate({
        left: xPos
    }, 10).animate({
        top: yPos
    }, 10, printme(xPos));

    i = i + 1;
}

Первая ошибка, которую я получил, была "не определять функции в цикле".Дайте мне знать, если этот код помогает.

0 голосов
/ 09 марта 2011

У вас есть закрытие там. Вы должны иметь доступ к обеим этим переменным уже. Можете ли вы опубликовать точный код просьбы?

0 голосов
/ 09 марта 2011

Вы можете определить их как глобальные переменные, то есть вне какой-либо функции или объекта.Тогда вы можете получить к ним доступ из любого места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...