2011-10-26 3 views
1

J'ai une fonction qui affiche des mots à différentes vitesses. La fonction démarre correctement, mais je n'arrive pas à obtenir le code correct pour l'arrêter à nouveau. Je sais que je dois utiliser clearInterval et je suppose que c'est pour vider la var myTimer - mais je n'arrive pas à faire fonctionner ça.Utilisation de clearInterval pour arrêter une fonction

Toute aide serait appréciée

HTML

<input type="button" value="Start" onclick="wpm($numberWords,$speed)" /> 
<input type="button" value="Stop" onclick="stopWpm()" /> 

JS

var myTimer; 

function wpm(numberWords,speed) { 

    var input = new Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s"); 

    var output = new Array(); 
    for (var i = 0; i < input.length; i += numberWords) { 
     output.push(input.slice(i, i + numberWords).join(" ")); 
    } 

    var i=0; 
    var myTimer =setInterval(timer,speed); //1000 will run it every 1 second 
    function timer() { 
     document.getElementById("timer").innerHTML = output[i]; 
     i++; 
     if (i == output.length){ 
      clearInterval(myTimer); 
     } 
    } 
} 

function stopWpm() { 
    clearInterval(myTimer); 
} 

Répondre

4

vous avez myTimer; en tant que variable globale et dans wpm() vous avez redéclarée il essayer de retirer le var de myTimer au sein de la fonction wpm()

// ... 
var i=0; 
myTimer = setInterval(timer,speed); //1000 will run it every 1 second 
function timer() { 
// ... 
+0

Nous vous remercions de votre aide - cela fonctionne et je vois maintenant pourquoi! Cependant, si je clique plusieurs fois sur le bouton Démarrer, le code affichera "non défini" à la fin de la boucle. Est-il possible de vérifier si la fonction est déjà en cours d'exécution? – tomp

+0

@tomp, pour vérifier si la fonction est déjà en cours, faire ensuite: après chaque appel de 'clearInterval (myTimer);' ajouter du code 'myTimer = 0;' et ensuite vous pouvez vérifier la fonction en cours comme 'if (myTimer) {/ * code si la fonction est en cours d'exécution ou prévue pour l'exécution * /} else {/ * code si la fonction n'est pas exécutée * /} '. Et acceptez la réponse. –

+0

Merci Andrew - très apprécié! – tomp

0
I had the same problem and this worked for me: 

    var operate = function() { start = setInterval(function(){ 
    ... 
    } 
} , time); } 
    var stop = function() { clearInterval(start); } 
    return { Start: start, Stop: stop } 
    } 

utilisation operate.Start() || operate.Stop() à gérer

+0

Un grand merci pour votre réponse et votre aide. – tomp