2012-02-06 13 views
6

私はjQueryの連鎖能力を理解していると思っていましたが、今はちょっと混乱しています。 jQueryの連鎖のロジックによってシンプルなjQuery連鎖の洞察

  • を、私が行うことができるはず:DIVをフェードアウトし、それを除去する例を使用して

    $(this).parent().fadeOut(500).remove(); 
    

しかし、その代わりにIこれを行う必要があります:

$(this).parent().fadeOut(500,function() { $(this).remove(); }); 

なぜですか?ありがとう!

答えて

11

.fadeOut()操作はすぐに(アニメーションを開始するだけで)すぐに戻る非同期操作であり、タイマーを介して実行を継続するため、すぐには.remove()に電話をかけることはできません。 .fadeOut()が戻り、次の連鎖操作が実行されると、アニメーションは開始されたばかりであり、完了していません。通常のチェーンで.remove()を実行した場合は、アニメーションが進行する前に直ちに削除します。

アニメーションの完了コールバックが呼び出されるまで待ってから削除する必要があります。

もう1つのチェーンアニメーションコールは例外です。アニメーションはアニメーションキューに入る特殊なケースなので、アニメーションを連結できます。アニメーションが開始されると、その後のアニメーションコールでは、すでにアニメーションが進行中であることがわかり、内部のキューに入ります。最初のアニメーションが終了すると、アニメーションキューをチェックして、より多くの連鎖アニメーションが開始するかどうかを確認します。

javascriptのほぼすべての非同期操作は、このように非ブロック化されています。つまり、それらを開始する呼び出しは、それを開始する呼び出しです。その呼び出しはすぐに戻り、操作の残りはタイマーや他のイベントを経て実行され、その後のJavaScriptは実行を継続します(他の連鎖メソッドを含む)。補完コールバックを登録することによって、操作が実際に完了したときのみを知ることができます。

同じことがなどのAjax操作、画像の読み込みのために真である...

あなたは、アニメーションキューを介して.remove()方法の仕事を作成する方法について考えて私を得ました。

$.fn.fxRemove = function() { 
    this.queue(function(next) { 
     $(this).remove(); 
     next(); 
    }); 
    return(this); 
} 

削除のこの形式は、アニメーションキューに入り、それが行われる前にアニメーションが連鎖したときに実行されます:一つは、実際には削除の新しいバージョンを作成することにより、()のようにそれを行うことができます。だから、あなたはそれから使用できます。

$(this).parent().fadeOut(500).fxRemove(); 

ここで働く例があります:

$(this).parent().fadeOut().delay(500).remove(); 
+1

わずかにそれに追加します。アニメーションはキューに追加され、非アニメーションはキューに追加されません。 'remove'はアニメーションではないのですぐに起こります。 'fadeOut'の後の' fadeIn'のようなものは、 'fadeOut'が完了するのを待つでしょう。これは誤解されることがよくあります。 –

+0

jQueryでこの設計の意義を理解するのは苦労します。ほとんどの初心者を欺くのではないですか? – Leo

+0

@Leo - これはjQueryの設計上の決定ではありません。 javascriptが動作するため、イベントに応答できるブラウザで長時間実行される操作は、このような非同期(非ブロッキングなど)である必要があります。それらが非同期である場合、javascriptエンジンは次の連鎖操作を実行します。チェーン化を使用してこの問題を解決する別の方法は実際にはありません.jQueryがどうにかしてすべての連鎖操作をキューに入れなければ、さらに複雑になる可能性があります。はい、それは初心者を馬鹿にします。それは学ばなければならないものです。 – jfriend00

-1

が道にそれを試してみてください。

DEMO

$.fn.q = function(fn) { 
    var that = this, arg = Array.prototype.slice.call(arguments, 1); 

    return this.queue(function(next) { 
     that[fn].apply(that, arg); 
     next(); 
    }); 
}; 

用法:

$(this).parent().fadeOut(500).q('remove'); 
+0

これはうまくいきません。 '.delay()'は同期していません。 '.fadeOut()'のように非同期です(アニメーションキューを通ります)ので、 '.remove()'が実際に呼び出されたときに遅れることはありません。 – jfriend00

+0

['.delay()'メソッド(http://api.jquery.com/delay/)は後続のアニメーションメソッドを遅らせるだけなので、これはまったく役に立ちません。 – nnnnnn

関連する問題