アニメーションは非同期で発生するため$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
関数内の が他のオブジェクトを参照している可能性は十分にあります...
さて、あなたの例では、 jQueryオブジェクトthis
によって表されるDOMオブジェクトへの外部参照である可能性があります(つまり、おそらくこのスニペットが取得された場所の上のどこかにあるでしょう)。この場合、 2 つの は同じであるため、 は不要です。でも、わからないので、確かめてみようと思いました。そこで、「右」を参照する新しい変数 を作成してクロージャ* を作成しました(はクロージャに含まれるようになったため、コールバック内の正しいものを参照していることがわかります)。$this
var $this = $(this);
x
this
x
this
x
queue
* ちょっと面倒ですが、最後にリンクされた記事を読み進めれば、javascript がどのように連携しているかをよく理解できます。