1

我有以下几行 jQuery:

// When dragging ends
stop: function(event, ui) {
    // Replace the placeholder with the original
    $placeholder.after( $this.show() ).remove();
    // Run a custom stop function specitifed in the settings
    settings.stop.apply(this);
},

我不想settings.stop.apply(this);运行直到上面的行是($placeholder.after( $this.show() ).remove();),现在发生的事情settings.stop是运行到早。

使用 jQuery,我怎样才能对这两行进行排序,直到第一行完成才继续?

4

2 回答 2

1

动画是异步发生的,这就是为什么你$this.show()没有settings.stop.apply...在行之前完成。所有动画最终都在默认(“fx”)队列中,一个接一个地播放。您可以使用函数向该queue序列添加一些东西(即使它不是动画)。因此,要调整您的示例:

// When dragging ends
stop: function(event, ui) {
    // Replace the placeholder with the original
    $placeholder.after( $this.show() ).remove();
    // Run a custom stop function specitifed in the settings
    var x = this;   //make sure we're talking about the right "this"
    $this.queue(function() {
        settings.stop.apply(x);
        $(this).dequeue();    //ensure anything else in the queue keeps working
    });
},

编辑以回应您的评论“正确的“这个”是什么意思? “:

在 JavaScript 中,this它可能是一个棘手的野兽,它会根据引用的范围而变化。在传递给queue函数的回调中,this将引用queue正在执行的 DOM 对象(即由 引用的 DOM 对象$this。但是,this外部stop函数中的 完全有可能引用其他对象...

现在,在您的示例中,可能是外部this引用了由 jQuery 对象表示的 DOM 对象$this(即,您可能在var $this = $(this);上面的某个地方获取了该片段的来源)。在这种情况下,这x是不必要的,因为两个thiss 本来是相同的。但既然我不知道,我想我应该确定一下。所以,我通过创建一个新变量创建了一个闭包x* ,它指的是“正确” thisx现在被捕获在闭包中,所以我们确定它指的是queue回调中的正确事物)。

* 这有点费力,但如果你能通过最后链接的文章做到这一点,你最终会对 javascript 如何挂在一起有一个很好的理解。

于 2010-05-24T04:47:36.713 回答
1

另一种等待动画结束的方法是使用它的回调:

stop: function(event, ui) {
     $placeholder.after( $(this).show('fast', 
                           function() { // called when show is done
                              $placeholder.remove(); // var still accessable
                              settings.stop.apply(this);
                            });
                       );
于 2010-05-24T05:13:34.003 回答