2010-05-24 31 views
1

我的jQuery的下面幾行:測序2行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,我如何排序這兩行直到第一個完成才能繼續?

回答

1

動畫是異步發生的,這就是爲什麼你的$this.show()沒有在settings.stop.apply...行之前完成。所有動畫都會在默認(「fx」)隊列中結束,該隊列依次播放。您可以使用the queue function將某些內容(即使它不是動畫)添加到此序列中。因此,要適應你的例子:響應您的評論

// 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 can be a tricky beast,即根據引用的範圍而變化。在傳遞給queue函數的回調函數中,this將引用queue正在執行的DOM對象(即,由$this引用的DOM對象。但是,外部函數stop中的this完全可能指的是某些其他的對象......

現在,機會是,在你的榜樣,外this提到了由$this jQuery對象代表(即你可能已經得到某處以上,其中這個片段被帶到一個var $this = $(this); DOM對象from)。在這種情況下,x是不必要的,因爲兩個this都會是一樣的。但是因爲我不知道,我以爲我應該當然。所以,我通過創建一個新變量x *,提到「right」thisx現在被關閉了,所以我們知道它確實指的是queue回調中的正確內容)* created a closure *。如果你能通過最後一篇鏈接的文章,你會最終了解JavaScript是如何掛在一起的。

+0

你什麼意思通過正確的「這」嗎? – AnApprentice 2010-05-25 03:39:13

+0

@nobosh - 請參閱我的編輯(無法在評論中加入) – Alconja 2010-05-25 04:20:43

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); 
          }); 
         ); 
+0

這項工作相當不錯,但會讓動畫真正地跳動。有任何想法嗎? – AnApprentice 2010-05-25 03:47:03