Javascript & JQuery: как сделать функцию бесконечной с помощью обратного вызова animate? - PullRequest
1 голос
/ 04 марта 2011

есть объект класса 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

Спасибо за любую помощь!

Ответы [ 2 ]

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

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

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

}

Затем внутри вашего jQuery animate вы можете ссылаться на свой класс с помощью переменной class

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

Оберните функцию abon_move() в вызове setTimeout следующим образом: setTimeout(abon_move, 300);, чтобы она выполнялась каждые 300 мс.

...