2013-08-22 10 views
5

私はJavascriptでカスタムスライダーを作成しています。ユーザーがスライダーの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); 
setTimeout(startSlidercicle(), 3000); 

か:

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

私がするコード変更:

clearInterval(ciclo); 
startSlidercicle(); 

をそして今、スライダーだけで正常に動作します。最初の2つの提案では、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()に渡すことを意味します。関数の名前を()にしただけで、関数参照をsetTimeout()に渡すだけです。これはよくある間違いです。

関連する問題