2013-08-22 12 views
5

Sto costruendo un cursore personalizzato su Javascript, e voglio che ogni volta che l'utente fa clic su un div del cursore, il cursore dovrebbe fermarsi per X secondi.perché il ciclo setInterval() va più veloce ogni volta?

Il mio codice è:

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

Ma il problema è che ogni volta che clicco e fermo il cursore, il ciclo si avvia sempre più velocemente. Come posso ripararlo?

+2

Si dovrebbe usare 'setTimeout (startSlidercicle, 3000)' (nessuna parentesi dopo 'startSlidercicle'). Ma questo non dovrebbe causare ciò che descrivi ... – bfavaretto

+0

Posso solo riprodurlo se faccio clic su .slide div più volte (vedi http://jsfiddle.net/XdMHz/). Dovresti aggiungere una guardia contro questo, perché crea dei timer "rimanenti" che non puoi fare riferimento/cancellare. – bfavaretto

+0

Ho letto alcune domande sullo stesso argomento, ma non ho ancora chiaro come prevenire o chiudere quei timer multipli – Erzei

risposta

4

Invece di:

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

o:

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

ho cambiato il codice per essere:

clearInterval(ciclo); 
startSlidercicle(); 

Ed ora il cursore semplicemente funziona bene. Penso che, nelle prime due proposte, ogni volta che clicco sul div, viene creata una nuova funzione, "sovrapposta" al ciclo esistente e, quindi, sembra che il cursore acceleri, ma è solo un ciclo che ricomincia un altro.

+0

Già testato con Firefox 23, IE 9, Opera 12+ e Chrome 29 su Windows 7 e funziona ancora bene – Erzei

+1

La mia conclusione è che 'clearInterval (ciclo)' termina il ciclo 'setInterval' all'interno di' startSlidercicle() ', quindi, non c'è alcun codice rimanente all'interno della funzione ed esce, quindi salta alla riga successiva dove I chiama un nuovo 'startSlidercicle()', e se clicco più volte, sto solo finendo e iniziando nuovi metodi 'setInterval' – Erzei

1

è necessario modificare questo:

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

a questo:

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

Nel codice esistente, che si sta chiamando startSlidercirle immediatamente e non è in attesa fino a quando i setTimeout() incendi perché si ha la () dopo il nome della funzione. Ciò significa eseguirlo immediatamente e passare il risultato dell'esecuzione a setTimeout(). Si desidera semplicemente passare il riferimento alla funzione setTimeout() che viene eseguita semplicemente dopo avere il nome della funzione senza () dopo di esso. Questo è un errore comune.

Problemi correlati