2010-06-17 2 views
1

나는 5 초마다 setInterval을 사용하여 자동으로 이미지를 변경하는 간단한 슬라이드 쇼를 가지고 있습니다.clearInterval없이 setInterval에서 타이머 재설정

사용자는 이전 및 다음 링크를 사용하여 한 이미지에서 다른 이미지로 이동할 수도 있습니다.

사용자가 이전/다음 링크를 클릭하면 타이머가 인터럽트되지 않습니다. 예를 들어, 타이머가 3 초 동안 링크를 클릭하면 다음 이미지 만 2 초간 다시 표시되어 다시 변경됩니다 .

나는 clearInterval을 사용하고 setInterval을 다시 사용하여이 작업을 수행 할 수 있음을 알고 있지만 깨끗한 방법이 있습니까?

여기 당신이 그것을 필요로하는 경우에 내 코드입니다 :

//Move to next image every 10 seconds unless paused. 
var timeInterval = 5000; 
var featureSlide = window.setInterval(function() { nextFeature("next")}, timeInterval); 

$("a#feature-prev").click(function() {   
    nextFeature("prev"); 
    return false; 
}); 

$("a#feature-next").click(function() { 
    nextFeature("next"); 
    return false; 
}); 



function nextFeature(action) { 

    var idNow = $("ul#features li:visible").attr("id"); 
    var pos = idNow.replace("feature-", ""); 

    //If image is currently animated do nothing 
    //If this isn't in place then multiple images are displayed 
    if ($("li#" + idNow).is(":animated")) { 
     return; 
    } else { 

     if (pos == 4 && action == "next") { 
      pos = 1; 
     } else if (pos != 4 && action == "next") { 
      pos++; 
     } else if (pos !=1 && action == "prev") { 
      pos--; 
     } else if (pos == 1 && action == "prev") { 
      pos = 4 
     } 


     pos = "feature-" + pos; 
     // Slide to next image 
     $("li#" + idNow).hide("slide", { direction: "right" }, 1000, function() { 
      $("li#" + pos).show("slide", { direction: "left"}, 1000); 
     }); 


    } 
} 

감사합니다!

답변

1

타이머를 취소하고 다시 시작하지 않고 다시 시작할 수는 없습니다.

또는 setInterval을 완전히 사용하지 않고 setTimeout 만 사용하면됩니다. 이미지를 표시 할 때마다 다음 코드를 예약하십시오 (바로 코드를 읽는다면 이 nextFeature에 있음). 그런 다음 간격 재설정은 특별한 것이 아니라 논리 흐름의 부산물로 발생합니다.

+0

고마워요. 사용자가 이전/다음 링크를 클릭하지 않는 한 동일한 함수가 5 초마다 호출되어야하므로 setInterval을 계속 사용한다고 생각합니다. clearInterval을 추가 한 다음 setInterval을 다시 사용하여 nextFeature가 시작될 때 타이머를 다시 시작합니다. –

+0

@Phil : Cool. 내가 약간 당신의 코드를 오독 한 것처럼 BTW, 보인다. 'setTimeout' 접근법을 사용했다면,'show' 호출이 아닌'hide' 호출 후에 수행하기를 원할 것입니다 (미안하지만 완료 콜백에 빠졌습니다). 그렇게했다면 모든 브라우저 타이머를 해결하는 데 5 초마다 걸릴 것입니다. 하지만 애니메이션이 계속 진행되고있는 상황에서이 접근법에 대해 논쟁 할 수있는 사례를 처리해야합니다. 재미 있습니다! –