2011-08-15 3 views
0

jplay에서 autplay로 간단한 Slider를 작성했습니다. 자동 실행이 활성화 된 경우 함수를 가리키는 setTimeout이 설정됩니다. 이 함수는 자체적으로 재귀 적 setTimeout을가집니다.애니메이션에서 Chrome 시간 초과 문제가 발생했습니다.

Chrome을 제외한 모든 기능이 잘 작동합니다. 탭을 변경 한 후 잠시 기다렸다가 돌아 오면 슬라이더가 놀란다. 타임 아웃의 인스턴스가 여러 개있는 것처럼 보입니다 ...하지만 같은 변수에 타임 아웃을 지정 했으므로 그럴 수 없습니다.

일부 관련 코드 :

var timer; 

    function autoplay() { 
    currentPosition++; 
    if(currentPosition == numberOfSlides) { 
     // last slide 
     currentPosition = 0; 
    } 
    manageNavigation(currentPosition); 

    // Hide/show controls 
    manageControls(currentPosition); 

    // animate the slides 
    slideshowAnimate(); 

    // set timer 
    if(autoplay_enable) { 
     //clearTimeout(timer); 
     timer = setTimeout(function() { autoplay() }, interval*1000)  
    } 
    } 
    function setTimer() { 
    if(autoplay_enable) { 
     timer = setTimeout(function() { autoplay() }, interval*1000)  
    } 
    } 

    setTimer(); 

답변

0

아니, timer의 값을 재설정하는 것은 현재의 타이머를 취소하지 않습니다. 이를 위해서는 clearTimeout해야합니다. 모든 타이머 보류는 타이머에 대한 숫자 참조이며 클로저 또는 그 자연의 것이 아닙니다.

당신이 setTimer()을 시작하기에 좋은 조건을 가지고 가정, 코드 더 다음과 같아야합니다

var timer; 

function autoplay() { 
    clearTimeout(timer); //! New code. 
    currentPosition++; 
    if(currentPosition == numberOfSlides) { 
     // last slide 
     currentPosition = 0; 
    } 
    manageNavigation(currentPosition); 

    // Hide/show controls 
    manageControls(currentPosition); 

    // animate the slides 
    slideshowAnimate(); 

    // set timer 
    setTimer(); //! Switched from having multiple startup locations. 
} 
function setTimer() { 
    if(autoplay_enable) { 
     timer = setTimeout(autoplay, interval*1000); //! Removed unnecessary closure. 
    } 
} 

setTimer(); 
+0

이 코드는 의미 상으로 다른 것으로 생각합니다. 원래 코드를 이와 같이 변경하면 tabchange 후에 Chrome이 실패하고 나중 단계에서 탭으로 돌아갑니다. –

+0

정말 추가해야 할 유일한 비트는 clearTimeout입니다. 스타트 업 상태와 관련하여 다른 문제가있는 것 같습니다. 이 모든 것이 글로벌이거나 단일 시작 폐쇄로 감싸 였을 것으로 기대합니까? –

0

에서는 setTimeout의 반환이 타이머의 내부 인식에 사용되는 인덱스 번호가 아닌 것입니다 실제 타이머 자체. 따라서 타이머를 가리키고있는 것을 덮어 쓰면서 타이머를 다시 만들 때 실행중인 타이머를 제거하지 않습니다.

컴퓨팅 성능을 유지하기 위해 Chrome 엔진은 백그라운드 탭에서 실행되는 대부분의 자바 스크립트를 정지시키고 다시 포커스를 맞출 때 "따라 잡으려고"시도합니다. 이 문제를 해결할 수있는 방법이 무엇인지 모릅니다. 분명히 clearTimeout을 사용하거나 Timer 객체를 사용하여 반복적 인 동작으로 이것을 잡아내는 것이 좋습니다.

+0

그래, 근본적으로 Chrome의 문제입니까? '따라 잡기'란 결국 마침내 애니메이션처럼 움직일 수 있음을 의미합니까? –

+0

여기에 dev 채널에 대한 몇 가지 의견이 있습니다. http://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/ff827011f2d1f0f6 관심을 끌지 만 스로틀 링은 1 초당 1 초가되어야합니다. 그것을 죽이는 애니메이션 전환 일 수도 있고, 애니메이션 잠금을위한 부울을 넣거나 테스트를 위해 애니메이션을 제거 할 수도 있습니다. – longstaff

0

작은 수정을 시도했습니다. 당신은 ... 당신의 코드

var timer; 

이 도울 수

$(window).blur(function() { 
    clearTimeout(timer); 
}).focus(function() { 
    timer= setInterval(autoplay, interval*1000); 
}); 

희망이를 추가 할 수 있습니다.