【问题标题】:Javascript & jQuery: how to make function infinite through animate callback?Javascript & jQuery:如何通过动画回调使函数无限?
【发布时间】:2011-03-04 17:31:59
【问题描述】:

有一个 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 指向由jQuery 选择的HTML 元素。

更新:

 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

感谢您的帮助!

【问题讨论】:

    标签: javascript jquery this


    【解决方案1】:

    试试这个:

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

    然后,在您的 jQuery animate 中,您可以使用变量 class 来引用您的类

    【讨论】:

    • 正是我想要的 =)
    • 其实我犯了一个错误。我相信class是JS中的保留关键字,但你可以使用任何其他名称
    • aw,我认为有必要使用class,无论如何它有效,谢谢=)
    【解决方案2】:

    将函数 abon_move() 包装在 setTimeout 调用中,例如:setTimeout(abon_move, 300);,因此它将每 300 毫秒运行一次。

    【讨论】:

    • 实际上会有一个对象数组。而且我现在真的不明白。我创建了另一种方法,其中包含:仅setTimeout(abon_move, 300);,而abon_move() 不起作用,因为我与this 没有连接
    • 好的,但是将移动功能放在Abon中。例如Abon.prototype.move = function() {}。然后您就可以访问this。然后将您的计时器作为事件循环,例如setTimeout(function() { for (a in array_of_abons) { a.move(); }, 300);
    • 试过了,没有结果。你能看看我在原始消息中发布的更新吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多