2012-02-08 14 views
2

3番目のアニメーションがデキューされると予想されますが、デキューされていないため、その理由がわかりません。ここにはdemoがあります。あなたは、コールバックに渡されるnext引数を使用する場合は、キューへの対処jQueryキューからのデキューが機能しない

$('#di').animate({left:300},3000,function(){//animation callback 
    $('#hello').html('1st is done'); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('2nd is done'); 
}).queue(function(){//queue 
    $(this).animate({left:300},3000, 
    function(){//animation callback 
     $('#hello').html('the inside queue is done'); 
     $(this).dequeue(); 
    }) 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('the last queue is done'); 
}); 
+0

Omg、コードおなら!正しくインデントしてください。 – elclanrs

+1

質問している内容が分からないので、質問を再度お聞かせください。 – jfriend00

+0

3番目のアニメーションは2番目のアニメーションの後に実行する必要がありますが、アニメーションについてではありません – Amged

答えて

2

:あなただけのこの操作を行うことができるように、すべてのアニメーションが自動的にキューに行くように、この場合の.queue.dequeue

何がアニメーション化する機会を得る前に、キューは次のようになります...

animate // left:300 
callback 
animate // left:0 
callback 
callback via queue 
animate // left:0 
callback 

は何も開始する前に、すべてこの問題が発生したことを覚えておいてください。

dequeueが、コールバックのqueue()コールバックで行われるアニメーションのコールバックに追加されているという問題があります。これは

animate // run, then automatically dequeue 
callback // run, then automatically dequeue 
animate // run, then automatically dequeue 
callback // run, then automatically dequeue 
callback via queue // run, place the new animation and callback on the end + 
animate //                 | 
callback //                 | 
                      | 
animate // <---------------------------------------------------------------+ 
callback // The dequeue() happens in here 

だからあなたはあなたが最後に貼り付けるデキューことを、見ることができます...新しいコールバックがキューの最後に置かされることを意味し、そのキューがあなたの queue()コールバックした後に貼り付けられています。

+0

.queue(fun(){})のように.queueに関数を渡すことを意味する 渡された関数をキュー配列の最後のインデックスにする??? – Amged

+1

@Amged:かなり。基本的には、アニメーションが開始する前にすべての同期コードが実行されることを覚えておく必要があります。したがって、メインチェーンには 'animate()。animate()。queue()。animate()'があります。これは、キューがどのように見えるのか、コールバックが挿入されたものです。だからあなたの 'queue()'コールバックが最終的に実行されると、内部にネストされた 'animate()'が最後に追加されます。 'queue()'コールバック内で直接デキューしなかったので、キューはすぐに停止しています。 –

+1

...ネストされた 'animate()'コールバック*ではなく 'queue()'コールバックで直接 'dequeue()'を実行すると、デキューできます。まだ最後に来るので、それは望ましい順序から外れるでしょう。 –

3

が最も簡単ですが、あなたのケースで、私はこの問題は、手動でキューに入れ、アニメーション機能をデキューしようとしているということだと思うことそれ自体が待ち行列を乱している。

$('#di').animate({left:300},3000,function(){//animation callback 
    $('#hello').html('1st is done'); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('2nd is done'); 
}).queue(function(next){//queue 
    $('#hello').html('the inside queue is done'); 
    next(); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('the last queue is done'); 
}); 

をしかし、使用する本当の理由はありません:あなたはこのようなキューと混乱しないし、あなたがdequeue()またはI next()を使用することを好むのいずれかを使用することができ、通常の関数を使用する場合は正常に動作する必要がありますあなたは、各機能がキューに何かを追加することができた順番の観点から考える必要がある

$('#di').animate({left:300},3000,function(){//animation callback 
    $('#hello').html('1st is done'); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('2nd is done'); 
}).animate({left:300},3000, function(){//animation callback 
     $('#hello').html('the inside queue is done'); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('the last queue is done'); 
}); 
+0

キューを理解したいだけですが、なぜこの問題が発生したのか理解したいですか? – Amged

+0

'.dequeue()'は理解するのが難しいです(私は完全に理解していません)。私の最初のコード例のように 'next()'引数を使うと、それはいつもうまくいくので、私はそれをうまくやっています。 – jfriend00

+0

別の質問、私はキュー配列の特定のインデックスを実行するために使用できる任意の方法はありますか? – Amged

0

短答:queue: falseオプションをファンクション内のanimateコールに追加します。this jsFiddleを参照してください。説明と

ロング答えは:@ jfriend00によって

答えはqueue機能でanimate呼び出し自体がキューを扱っているという意味ではほとんどがあります。 @Amgedは詳細を尋ねたので、私はソリューションを提供するだけでなく、空白を埋めると思った。

jQueryでは、各要素は名前付きキューのセットを持つことができます。デフォルトでは、要素上でanimateを呼び出すと、アニメーションはその要素の 'fx'キューに入ります。同様に、明示的なキュー名を持たないでqueueを呼び出すと、その関数は 'fx'キューに置かれます。

したがって、animateコールが含まれていることによってブロックされているのは、queue機能です。私の答えの冒頭で述べたように、あなたがwork demo hereを見つけることができます

$('#di').animate({left:300},3000,function(){//animation callback 
    $('#hello').html('1st is done'); 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('2nd is done'); 
}).queue(function(){//queue 
    $(this).animate({left:300}, { 
     duration: 3000, 
     // Don't queue the animation, otherwise it gets queued on the default 
     // queue ('fx') and since we're currently running in this queue, it 
     // would block 
     queue: false, 
     complete: function(){//animation callback 
      $('#hello').html('the inside queue is done'); 
      $(this).dequeue(); 
     } 
    }) 
}).animate({left:0},3000,function(){//animation callback 
    $('#hello').html('the last queue is done'); 
}); 

ソリューションはないキューアニメーションにあります。

関連する問題