Javascript & jQuery: как да направя функцията безкрайна чрез анимирано обратно извикване?

имам обект от клас Abon и след това искам този обект да се движи из страницата.

a = new Abon();
a.init();
a.move();

методът move() съдържа:

function abon_move () {
  var x = this.x;
  var y = this.y;

  var direction_x = Math.random()*5 - 5;
  var direction_y = Math.random()*5 - 5;

  var x_new = x + direction_x * this.movement_rate;
  var y_new = y + direction_y * this.movement_rate;
  console.log(x_new+" "+y_new)
  $(".abonent."+this.id).animate( {
        left:+x_new,
        top:+y_new
    }, 'slow', "linear", function() { this.move() });
}

Всичко, което искам, е методът move (представен като функция abon_move()) да се повтаря отново и отново, след като animate спре. Но проблемът е, че this.move(), показан в обратното извикване, няма връзка с моя обект, защото this на това място сочи към HTML елемента, избран от jQuery.

UPD:

 function Abon(id) {
   ...
this.move = abon_move;
   ...
 }
 Abon.prototype.move = abon_move;

И действителният метод е същият, но без обратно извикване в animate

тогава се опитвам да направя следното:

 setInterval( a[0].move , 300); //doesn't work - says `this` members are undefined
 setInterval( a[0].move() , 300); //works only one time and stops

Благодаря ви за всяка помощ!


person M2_    schedule 04.03.2011    source източник


Отговори (2)


Опитайте тази :

function abon_move () {
    var x = this.x;
    var y = this.y;
    var class = this;
    ...

}

След това във вашия jQuery animate можете да се обърнете към вашия клас, като използвате променливата class

person 3rgo    schedule 04.03.2011
comment
точно това, което търсих =) - person M2_; 04.03.2011
comment
всъщност направих грешка. Вярвам, че class е запазена ключова дума в JS, но можете да използвате всяко друго име - person 3rgo; 04.03.2011
comment
ой, реших, че е необходимо да използвам class, така или иначе проработи, благодаря =) - person M2_; 04.03.2011

Опаковайте функцията abon_move() в setTimeout извикване като такава: setTimeout(abon_move, 300);, така че да се изпълнява на всеки 300 ms.

person Marcus Frödin    schedule 04.03.2011
comment
всъщност ще има масив от обекти. И сега наистина не го разбирам. Създадох друг метод, който съдържа: само setTimeout(abon_move, 300); и abon_move() не работи, защото нямам връзка с this - person M2_; 04.03.2011
comment
Добре, но поставете функцията за преместване в Abon. напр. Abon.prototype.move = function() {}. Тогава ще имате достъп до this. След това направете своя таймер като цикъл на събитие, като например setTimeout(function() { for (a in array_of_abons) { a.move(); }, 300);. - person Marcus Frödin; 04.03.2011
comment
пробвах, няма резултат. Бихте ли могли да погледнете актуализацията, която публикувах в оригиналното съобщение - person M2_; 04.03.2011