2012-09-06 10 views
9

私はtimelineという定義を持っており、セレクタと、そのオブジェクトに適用する遅延とアニメーションのリストをリストしています。特定のオブジェクトのステップをループするように指定することができます。ここでjQueryのアニメーションの遅延問題がセルフキューにループされています

は、アニメーションをキューに使われている機能である:ここでは

function animateWithQueue(e, obj) { 
    if ($.queue(e[0]).length == 0) { 
     e.queue(function doNext(next) { 
      $.each(obj.steps, function(i, step) { 
       e.delay(step.pause).animate(step.anim, step.options); 
      }); 
      if (obj.loop) { 
       e.queue(doNext); 
      } 
      next(); 
     }); 
    } 
}​ 

timeline情報

var timeline = { 
    '.square': { 
     loop: true, 
     steps: [ 
      { pause: 800, anim: { right: '+=200' }, options: { duration: 400} }, 
      { pause: 1000, anim: { right: '-=200' }, options: { duration: 400} } 
     ] 
    }, 
    '.circle': { 
     loop: true, 
     steps: [ 
      { pause: 1200, anim: { top: '+=200' }, options: { duration: 400} }, 
      { pause: 1200, anim: { top: '-=200' }, options: { duration: 400} } 
     ] 
    } 
}; 

そして、ここでは、上記のアニメーション機能にtimelineを置く機能である:

$.each(timeline, function(selector, obj) { 
    animateWithQueue($(selector), obj); 
}); 

完全な例です。 http://jsfiddle.net/sprintstar/Tdads/

このコードは正常に動作するように見える、アニメーションループと停止ボタンはアニメーションを停止するためにクリックすることができ、キューをクリアするなど、我々が直面している問題は、停止を押すことでトリガーされ、何度も起動することができますが(例えば10回)。遅延が正しく機能していないことに気付き、形状がはるかに速く動くようになります。

なぜ、どのように修正できますか?以下のよう

+0

便利かもしれませんあなたは、プログラムのバグを引き起こすことができる方法はありますか?これはデバッグプロセスに役立ちます。 – David

+0

手動停止/開始はアプリケーションの仕組みを反映しています。停止/開始ボタンをクリックすると、前に移動したときに表示されていない遅延の効果を簡単に確認できます。 – Sprintstar

+0

複数開始開始停止開始 http://jsfiddle.net/tjdA3/ 複製: –

答えて

1

何かがdelayとかなり右に動作していない...周りの仕事として

は、私は、this fiddledoTimeoutに置き換えました:

e.delay(step.pause).animate(step.anim, step.options); 

は次のようになります。

var timerName = e[0].className + $.now(); 
    timeouts.push(timerName); 
    e.queue(function(next) { 
     e.doTimeout(timerName, step.pause, function() { 
      this.animate(step.anim, step.options); 
      next(); 
     }); 
    }); 

timeoutsは、固有のタイムアウトIDの配列です。各タイムアウトIDは、停止ボタンがあらかじめ設定されているときにクリアされますssed。

私が言ったように、修正の回避策は、停止時にも要素の位置をリセットする必要があるためです。 (上の/右の定義から+ =と - =を削除していることに注意してください)

0

あなたの停止ハンドラを見て私はwstlが。 私はそれを保持divの代わりに.circleと.squareでターゲットにします。

アニメーションで問題が発生したのは、要素が速くて速くて速く動いていて、アニメーションが自分自身の上に積み重なっていたという結論だったからです。

api.jquery.com/clearQueue/とhttp://api.jquery.com/stop/

+0

円と正方形は両方とも運動場ではdivであるため、保持divではなくターゲットになります。 – Sprintstar

+0

私は今朝、読んだことをお詫びして申し訳ありませんが、私はまだstop()やclearQueue()があなたの問題の原因であると疑っています。あなたはclearQueue(true)を試しましたか? –

+0

私はフィドラーテストを更新しましたが、違いはありません。 :( – Sprintstar

関連する問題