2013-08-22 5 views
5

자바 스크립트에서 맞춤 슬라이더를 만들고 있는데, 사용자가 슬라이더의 div를 클릭 할 때마다 슬라이더가 X 초 동안 정지해야합니다.매번 setInterval()주기가 더 빨라지는 이유는 무엇입니까?

$(document).ready(function() { 
    var ciclo; 
    var index_slide = 1; 

    function startSlidercicle() { 
     ciclo = setInterval(function() { 
      // Slider code goes here 
     }, 3000); 
    } 

    //Here I start the slider animation 
    startSlidercicle(); 

    //When the user clicks on a div called 'slide', stop the cycle and start again the animation cycle 
    $('.slide').on('click', function() { 
     clearInterval(ciclo); 
     setTimeout(startSlidercicle(), 3000); 
    }); 
}); 

그러나 문제는 내가 클릭하고 슬라이더를 중지하는 것이 매번는,주기가 빨라 시작이다 :

내 코드입니다. 어떻게 해결할 수 있습니까? 이에

clearInterval(ciclo); 
setTimeout(startSlidercicle(), 3000); 

:

+2

'setTimeout (startSlidercicle, 3000)'을 사용해야합니다 ('startSlidercicle' 다음에 괄호가 없습니다). 그러나 그것은 당신이 묘사하는 것을 야기해서는 안됩니다 ... – bfavaretto

+0

.slide div를 여러 번 클릭하면 그 것을 재현 할 수 있습니다 (http://jsfiddle.net/XdMHz/ 참조). 참조 할 수 없거나 제거 할 수없는 "남은 시간"타이머가 만들어 지므로 경고를 추가해야합니다. – bfavaretto

+0

같은 주제에 대해 몇 가지 질문을 읽었지 만 여러 타이머를 방지하거나 닫는 방법을 분명히하지 못했습니다. – Erzei

답변

4

clearInterval(ciclo); 
startSlidercicle(); 

을 이제 슬라이더는 잘 작동합니다 :

clearInterval(ciclo); 
setTimeout(startSlidercicle, 3000); 

내가 할 코드를 변경했습니다. 처음 두 제안에서 div를 클릭 할 때마다 기존 함수에 "겹쳐진"새 함수가 만들어 졌으므로 슬라이더 속도가 올라가는 것처럼 보이지만 처음부터 다시 시작합니다. 다른.

+0

Windows 7의 Firefox 23, IE 9, Opera 12 이상 및 Chrome 29에서 이미 테스트를 마친 상태로 계속 작동합니다. – Erzei

+1

결론적으로'clearInterval (ciclo)'은'startSlidercicle()'내부의'setInterval' 싸이클을 종료합니다. 따라서 함수 안에 남아있는 코드가 없으므로 끝내고 다음 줄로 넘어갑니다. 새로운'startSlidercicle()'을 호출하고, 여러 번 클릭하면 새로운'setInterval' 메소드가 끝나고 시작됩니다. – Erzei

1

는이 작업을 변경해야

clearInterval(ciclo); 
setTimeout(startSlidercicle, 3000); 

을 기존의 코드를 즉시 startSlidercirle를 호출에서하고 있기 때문에 그것은 setTimeout() 화재 때까지 대기하지 않습니다 함수 이름 뒤에 (). 즉, 즉시 실행하고 실행 결과를 setTimeout()으로 전달하는 것을 의미합니다. 함수 참조를 에 전달하면 함수 이름 뒤에 ()이 없기 때문에 수행됩니다. 이것은 흔한 실수입니다.

clearInterval(ciclo); 
setTimeout(startSlidercicle(), 3000); 

나 : 대신