jQuery .each ()의 각 반복 사이에 일시 중지를 추가하는 방법은 무엇입니까?


81

jQuery 객체의 배열을 잡은 다음 .each ()를 통해 배열에서 각 개별 jquery를 수정합니다.

이 경우 CSS 전환을 활용하기 위해 -webkit-transition-property를 트리거하도록 클래스 이름을 업데이트했습니다.

각 CSS 전환이 시작되기 전에 잠시 멈췄 으면합니다. 다음을 사용하고 있지만 각 업데이트 사이에 지연이 없습니다. 대신, 모두 한꺼번에 업데이트되는 것처럼 보입니다.

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

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

나는 setTimeout이 이것을 해결하기를 바랬지 만 작동하지 않는 것 같습니다. 각 객체의 각 클래스 이름 업데이트 전에 일시 중지를 수행하는 방법이 있습니까?


다음과 같이 addPositioningClass 함수 주위에 따옴표를 사용해보십시오. setTimeout ( 'addPositioningClass ($ (this))', 500)
amosrivera

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

@JohnP-@DA는 코드가 작동하지만 모든 요소가 한꺼번에 위치한다고 말합니다. 함수의 범위가 문제의 일부라는 것을 몰랐습니다 ...
Rob

1
방금 바이올린으로 시도했지만 작동하지 않습니다. 착각 할 수도 있지만 그 코드가 어떻게 작동하는지 전혀 알 수 없습니다.
JohnP 2011 년

2
@JohnP-@DA는-> "다음을 사용하고 있지만 각 업데이트 사이에 지연이 없습니다. 대신 모두 한꺼번에 업데이트되는 것처럼 보입니다."
Rob

2
솔루션 :이 Git에도 있습니다 : gist.github.com/Zackio/7648481
Pranesh Janarthanan

49

오래된 스레드를 찾아서 미안하지만이 팁은 유사한 문제에 유용 할 수 있습니다.

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

6
그 조심 delay애니메이션 대기열 만 의미 못해 예에서 작동 css()합니다 ( 여기 )
연의 사진

20
지연시 .queue()(and .dequeue()) 를 사용해야합니다 .addClass().$(this).delay(500*index).queue(function() { $(this).children('.flipcontainer').addClass('visible').dequeue(); });
aksu

1
@aksu 거기에있는 것을 복사하여 답으로 만들어야합니다. 왜냐하면 댓글 사이에서 잃어 버리고 답이 제대로 작동하는 데 도움이 되었기 때문입니다.
adamj

10

500ms마다 자신을 호출하는 메서드를 만들면 그 트릭을 수행해야합니다. 다음 코드가 작동합니다.

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);
}

저도 항상 궁금 합니다만, 지금까지도이 방법을 적용 할 수있는 맥락을 찾지 못했습니다.
Sandwich 2011 년

3
내가 알 수 있듯이 delay ()는 jQuery 애니메이션에만 적용됩니다.
DA.

1

Safari / iOS 만 대상으로하는 경우 애니메이션 시퀀스의 정확한 타이밍을 제어하는 ​​것이 얼마나 중요한지에 따라 JS 시간 초과와 관련된 솔루션을 피해야합니다. 특히 느린 프로세서 나 백그라운드에서 많은 작업이 진행되는 컴퓨터에서 애니메이션이 시간 초과 지연과 동시에 완료된다는 보장은 없습니다. 최신 버전의 웹킷 (모바일 사파리 포함)에서는 @-webkit-keyframes. Webkit.org에는 이에 대한 멋진 소개가 있습니다 . 실제로 구현하기가 매우 쉽습니다.


나는 실제로 iOS (앱)만을 대상으로하고 있습니다. 나는 애니메이션 시퀀스의 타이밍을 정하는 것이 아니라 클래스 이름을 업데이트 할 때까지 기다리는 시간을 정하는 것입니다. 그러면 차례로 웹킷 전환 CSS가 트리거됩니다.
DA.

1

이것을 시도하십시오 :

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

솔직히 말해서 ... 과거에 $ (this) .delay ()가 어떤 경우에는 오작동했고 다른 경우에는 완벽하게 작동했습니다. 그러나 이것은 일반적으로 DOM 속성 조작이 아닌 jQuery 애니메이션 호출과 함께 사용되었습니다.

.delay ()는 setTimeout과 같은 방식으로 작동하지 않습니다. 자세한 내용 은 jQuery .delay () 문서를 참조하십시오 .

내가 아는 한 $ (). each는 절차 적으로 실행되므로 호출의 다음 반복은 선행 작업이 완료된 후에 만 ​​시작되어야합니다.


내가 틀렸을 수도 있지만 jquery 문서를 읽을 때 지연은 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"클래스를 통한 각 루프에 대해 추가 200ms 지연을 추가합니다. 이것은 각 행에 대해 멋진 지연된 쇼 효과를 생성합니다.

$( 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
코드를 던지는 것뿐만 아니라 주석을 추가하는 것이 가장 좋습니다.
woot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.