2017-08-30 3 views
0

J'ai un addEventListener dans mon loadGame() et chaque fois que j'appuie sur le bouton newGame, il lance loadGame(), mais je n'ai pas de valeur de retour dans loadGame() donc chaque fois que je tape Le bouton newGame relance le jeu, mais les eventListeners du template [i] semblent se chevaucher, donc si je tape 10 fois newGame, puis que je clique sur l'instruction else de la boucle, ça va essayer tryAgain() 10 fois. Comment puis-je quitter la fonction sur laquelle je suis quand je tape newGame? J'ai essayé d'ajouter une déclaration de retour à la fin de loadGame() mais cela n'a rien fait.Comment terminer une fonction avant qu'elle ne soit appelée à nouveau

newGame.addEventListener('click', function(){ 
    changeDifficulty(); 
}); 

function changeDifficulty(){  
      loadGame();   
    } 

boucle dans loadGame()

for (var i = 0; i < template.length; i++) { 
    //add colors to squares 
    template[i].style.backgroundColor = colors[i]; 

    template[i].addEventListener('click', function(){ 
     var clickedColor = this.style.backgroundColor; 

     if(clickedColor === correctColor) { 
      clearInterval(timeout); 
      message.innerHTML = "Correct!"; 
      newGame.textContent = "Play Again?"; 
     } 
     else { 
      fails++; 
      tryAgain(difficulty); 
      this.style.backgroundColor = "#232323"; 
      message.innerHTML = "Wrong!" 
     } 
    }); 
+0

im ne cherche pas à sortir de la boucle – Trippze

+0

si vous retournez faux dans n'importe quelle ligne de votre fonction, il finira. –

+0

Vérifiez clearInterval (timeout); –

Répondre

1

Vous devrez supprimer les écouteurs d'événements avant de vous inscrire de nouvelles:

function loadGame() { 
    // <...> 
    for (var i = 0; i < template.length; i++) { 
     //add colors to squares 
     template[i].style.backgroundColor = colors[i]; 

     template[i].addEventListener('click', clickHandler); 
    } 
    // <...> 
} 

function changeDifficulty() { 
    // remove all event listeners 
    for (var i = 0; i < template.length; i++) { 
     template[i].removeEventListener('click', clickHandler); 
    }  
    // Then call loadgame 
    loadGame();   
} 

function clickHandler(e) { // We need to be able to reference this function by name 
    var clickedColor = e.target.style.backgroundColor; 

    if(clickedColor === correctColor) { 
     clearInterval(timeout); 
     changeColorsOnWin(correctColor, template); 
     message.innerHTML = "Correct!"; 
     newGame.textContent = "Play Again?"; 
    } 
    else { 
     fails++; 
     tryAgain(difficulty); 
     this.style.backgroundColor = "#232323"; 
     message.innerHTML = "Wrong!" 
    } 
} 
+0

Je l'ai fait à votre façon et je semble avoir un problème avec la ligne "var clickedColor = this.style.backgroundColor;" J'ai fait clickedColor global mais je reçois toujours une erreur. L'erreur est "this" est indéfini. Il sort le premier modèle [i] mais pas le reste – Trippze

+0

@Trippze: J'ai mis à jour ma réponse un peu. Cela devrait fonctionner maintenant, en supposant que 'this' était censé être l'élément cliqué. – Cerbrus

+0

que dois-je passer dans clickhandler pour "template [i] .addEventListener ('click', clickHandler);" J'ai fait "template [i] .addEventListener ('click', clickHandler (template [i]);" mais ça dit encore undefined – Trippze