2017-03-02 11 views
1

私の関数の実行パスが異なり、1つまたは複数のjQueryメソッドが呼び出される可能性があります。これらのアニメーションは同時に開始する必要があり、シリアル化しないでください。たとえば、次のように2 jQueryアニメーションの完全なコールバックをグループ化するには?

function moveDown() 
{ 
    busy = true; 
    if(some condition) 
    { 
     $(".selFrame").animate({top: $("#row" + currentSelRowIndex).offset().top}); 
    } 
    else 
    { 
     $(".container").animate({scrollTop: $("#row" + currentRowIndex).offset().top - $("#row0").offset().top}); 
     $(".selFrame").animate({top: ($(".selFrame").offset().top + ch - remaining)}); 
    } 
} 

すべてのアニメーションが終了したかどうか、いくつかのbusy変数を使用して検出されていない私の目標は、我々が行ってきましたexacution経路を通ってどんなに。 1つのアニメーションコールでアニメーションcompleteの変数busyをリセットするのは簡単です。しかし、2つ以上のアニメーションを1つのイベントに結合する方法がわかりません。busy変数をリセットして、すべてのアニメーションが完了するようにします。

UPDATE

残念ながらフィルタリングソリューションは、徹底的なテスト後に良好な結果が得られたしませんでした。

それがない場合よりもはるかに優れた作品
document.addEventListener('keydown', function(e) { 
    var runningAnimations = $(".container, .selFrame").filter(":animated").length; 
    if(runningAnimations == 0) 
    { 
     switch(e.keyCode) 
     { 
     case 40: 
      moveDown(); 
      break; 

、時には、再入学を許可するダブルアニメーション例に。

promiseで2番目の方法を試してみます。

答えて

1

あなたは要素のコレクションに関連するすべてのアニメーションが終了したときに通知することにしたい

setTimeOut(function(){ 
    var runningAnimations = $(".container, .selFrame").filter(":animated").length; 
    }, 500); 
、あなたは promise使用できます

$(".container, .selFrame").promise().then(function(){ 
     // all finished 
     // we may change a boolean but usually we would call a callback 
}); 

これは、たとえば、if/elseの直後に入力できます。

+1

これはメソッドは 'filter'と比較してはるかに安定していることがわかります。 – Pablo

1

あなたは、アニメーションの数を保持する整数を使用し、各アニメーションのコールバックに1を減算しまたはその値が1であるかどうかを確認することができる:

if(some condition) 
    { 
     busy = 1; 
     $(".selFrame").animate({top: $("#row" + currentSelRowIndex).offset().top} , function(){ 
      busy--; 
     }); 
    } 
    else 
    { 
     busy = 2; 
     $(".container").animate({scrollTop: $("#row" + currentRowIndex).offset().top - $("#row0").offset().top}, function(){ 
      if(busy == 1) // all the animations have ended 
      busy--; 
     }); 

     $(".selFrame").animate({top: ($(".selFrame").offset().top + ch - remaining), function(){ 
      if(busy == 1) // all the animations have ended 
      busy--; 
     }}); 
    } 

あなたはまたsetTimeOut:animatedセレクタを使用することができ

+0

申し訳ありませんが、 'setTimeOut'はどのように2番目の解決策に関連していますか? – Pablo

+0

私は 'setTimeOut'の実装を追加して答えを更新しました – KAD

+0

ああ、今見ています。アクティブなアニメーションがあるかどうかに基づいてルーチンを実行できるかどうかを判断する必要があるときは、タイムアウトなしで 'runningAnimations'を使用するだけです。私は 'setTimeOut'を必要としないようです。 – Pablo