动画是异步发生的,这就是为什么你$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
是不必要的,因为两个this
s 本来是相同的。但既然我不知道,我想我应该确定一下。所以,我通过创建一个新变量创建了一个闭包x
* ,它指的是“正确” this
(x
现在被捕获在闭包中,所以我们确定它指的是queue
回调中的正确事物)。
* 这有点费力,但如果你能通过最后链接的文章做到这一点,你最终会对 javascript 如何挂在一起有一个很好的理解。