jQuery .each()の各反復の間に一時停止を追加するにはどうすればよいですか?


81

jQueryオブジェクトの配列を取得してから、.each()を使用して、配列内の個々のjqueryを変更しています。

この場合、クラス名を更新して、-webkit-transition-propertyをトリガーしてcss遷移を利用します。

各cssトランジションが始まる前に一時停止したいのですが。私は以下を使用していますが、各更新の間に遅延はありません。代わりに、それらはすべて一度に更新されているように見えます。

function positionCards() {
  $cards = $('#gameboard .card');
  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, 500 )
  });
}

function addPositioningClasses($card){
  $card
    .addClass('position')
}

setTimeoutでこれが解決することを期待していましたが、機能していないようです。各オブジェクトの各CLASS名が更新される前に一時停止を実行する方法はありますか?


次のように、addPositioningClass関数を引用符で囲んでみてください。setTimeout( 'addPositioningClass($(this))'、500)
amosrivera 2011年

1
反復ごとにタイムアウトをインクリメントできますか?たとえば、500,1000,1500 ...
Rob

回答:


96

これをコメントとして追加しましたが、正しく読んで自分の質問に答えたので、おそらくうまくいくでしょう:

function positionCards() {
  var $cards = $('#gameboard .card');

  var time = 500;

  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, time)
      time += 500;
  });
}

1
あなたのコードはOPとどう違うのですか?addPositioningClassesのコンテキストに存在しないため、スコープエラーがありますsetTimeout
JohnP 2011年

@ JohnP- @ DAは、コードは機能するが、すべての要素が一度に配置されると述べています。関数のスコープが問題の一部であることに気づいていませんでした...
Rob

1
フィドルで試してみましたが、うまくいきません。私は間違っているかもしれませんが、そのコードがどのように機能するのかまったくわかりません。
JohnP 2011年

2
@ JohnP- @ DAは言った->「私は以下を使用していますが、各更新の間に遅延はありません。代わりに、それらはすべて一度に更新されているように見えます。」
ロブ

2
解決策:これはこのGitにも存在します: gist.github.com/Zackio/7648481
Pranesh Janarthanan 2018

49

古いスレッドを掘り下げて申し訳ありませんが、このヒントは同様の問題に役立つ可能性があります。

$cards.each(function(index) {
    $(this).delay(500*index).addClass('position');
});

6
これdelayはアニメーションキュー専用であり、たとえば(ここを参照)では機能しないことに注意してcss()ください
Yan Foto

20
遅延する場合は.queue()(および.dequeue())を使用する必要があります.addClass()$(this).delay(500*index).queue(function() { $(this).children('.flipcontainer').addClass('visible').dequeue(); });
aksu 2015年

1
@aksuコメントの中で失われていて、あなたの答えが私がそれを正しく機能させるのを助けたので、あなたはそこにあるものをコピーして答えにするべきです。
adamj 2017

10

500ミリ秒ごとに自分自身を呼び出すメソッドを作成すると、そのトリックを実行する必要があります。次のコードが機能するはずです。

var __OBJECTS = [];

$('#gameboard .card').each(function() {
    __OBJECTS.push($(this));
});

addPositioningClasses();

function addPositioningClasses() {
    var $card = __OBJECTS.pop();
    $card.addClass('position');
    if (__OBJECTS.length) {
        setTimeout(addPositioningClasses, 500)
    }
}

フィドルでテスト済み:http//jsfiddle.net/jomanlk/haGfU/


.push()をもう少し調査する必要があります。気づかなかった!
DA。

3

どの程度.delay()

または

function addPositioningClasses($card){
  setTimeout(function() { $card.addClass('position')}, 1000);
}

私もいつもそう思っていますが、今日までこの方法を適用できる状況は見つかりませんでした。
サンドイッチ

3
私の知る限り、delay()はjQueryアニメーションにのみ適用されます。
DA。

1

Safari / iOSのみを対象としている場合は、アニメーションシーケンスの正確なタイミングを制御することがどれほど重要かによって異なりますが、JSタイムアウトを伴うソリューションは避ける必要があります。特に低速のプロセッサやバックグラウンドで多くの処理が行われているマシンでは、タイムアウトの遅延と同時にアニメーションが完了する保証はありません。それ以降のバージョンのWebkit(モバイルサファリを含む)では、を介して時限アニメーションシーケンスを使用でき@-webkit-keyframesます。Webkit.orgには素晴らしいイントロがあります。実際、実装は非常に簡単です。


確かに、私はiOSのみをターゲットにしています(これはアプリです)。私はアニメーションシーケンスのタイミングを計っていませんが、クラス名が更新されるまで待機する時間を計っています。これにより、Webkit遷移cssがトリガーされます。
DA。

1

これを試してみてください:

function positionCards() {
  $('#gameboard .card').each(function() {
      $(this).delay(500).addClass('position');
  });
}

正直に言うと...過去に$(this).delay()が誤動作したり、他のインスタンスで問題なく動作したりしたことがあります。ただし、これは通常、DOM属性の操作ではなく、jQueryアニメーション呼び出しと関連していました。

.delay()はsetTimeoutと同じようには機能しないことに注意してください。詳細については、jQuery .delay()のドキュメントを参照してください。

私の知る限り、$()。eachは手続き的に実行されるため、呼び出しの次の反復は、前の反復が完了した後にのみ開始する必要があります。


私は間違っているかもしれませんが、jqueryのドキュメントを読むと、delayはjQueryアニメーションを遅らせるためだけのもののように見えます。その最後の段落でもあなたは正しいと思います。問題は、クラスを設定する関数呼び出しを遅らせるのではなく、クラスを設定するタイミングを遅らせることでした。そのため、30個の要素すべてに同時に遅延を適用し、それらすべてが同じ時間遅延しました。
DA。

0

これをチェックしてください、私のためにうまくいきました!:)

jQuery('.optiresultsul li').each(function(index) {
    jQuery(this).delay(500*index).animate({ opacity: 1 }, 500,function(){
        jQuery(this).addClass('bgchecked');
    });
});

-2

このコードは、初期遅延を50msに設定します。次に、「。row」クラスのループごとに、さらに200ミリ秒の遅延が追加されます。これにより、各行に優れた遅延ショー効果が作成されます。

$( document ).ready(function() {
    // set inital delay
    var dtotal = 50;
    $(".row").each(function() {
    //add delay to function
      $(this).delay(dtotal).show();
    //add 200ms to delay for each loop
      dtotal = dtotal + 200;
    });
});

6
コードを投げるだけでなく、コメントを追加するのが最善です。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.