IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Un setInterval dans une boucle for


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 82
    Points : 25
    Points
    25
    Par défaut Un setInterval dans une boucle for
    Salut à tous!
    bon j'irai droit au but! Voici ce code qui affiche les éléments de mon tableau les uns après les autres avec setInterval, ça fonctionne, mais j'aimerais dans le cadre d'un pur entrainement de debutant, l'écrire autrement en lisant le tableau par une boucle for...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var tableau = ['Thierry','Linda','Carole', 'Sofiane'];
    var i=0;
    function Ligne(){
    	if(i < tableau.length){
    		document.getElementById('textDiv').innerHTML += tableau[i]+ '<br/>';
    		i++;	
    	}
    	else{
    		clearInterval(Ligne);
    	}
    }
    setInterval(Ligne, 1000);
    Donc voici ou je veux en venir à peu près
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var tableau = ['Thierry','Nicolas','Linda','Carole'];
    var i=0;
    function lance(){
    	for(var i = 0; c = tableau.length, i < c;i++){
    		function affich(){
    			document.getElementById('textDiv').innerHTML += tableau[i]+ '<br/>';
    		}
    	}
    	setInterval(affich,2000);
    }
    lance();
    Mais là ça m'affiche un "undefined" toutes les deux secondes à la suite! Soit j'ai pris une mauvaise direction depuis le début, soit j'ai la solution sous les yeux mais je bloque là!
    Si vous aviez une petite idée svp! Merci d'avance !!!

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    C'est un problème de "scope", ta fonction n'est pas visible à l'endroit où elle est appelée.

    Comme la fonction est déclarée dans la boucle for elle n'est pas visible en dehors.


    devYan.

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(var i = 0; c = tableau.length, i < c;i++){
    		function affich(){
    			document.getElementById('textDiv').innerHTML += tableau[i]+ '<br/>';
    		}
    	}
    tu déclares une fonction dans une boucle ?????
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Salut, Devyan a (comme toujours ;P) parfaitement raison.

    J'ajouterais que ta façon d'ajouter tes nouvelles entrées n'est pas très ergonomique si je puis dire.
    Perso lorsque je dois faire de la manipulation de dom j'évite au maximum innerHtml, de plus pour faire de tels ajouts je te conseillerais plutôt de créer des nouveaux éléments dans ton dom (que ce soit des <li>, <div>, <span>...), regarde du côté de htmlElement#appendChild().

    Sinon, à propos de ta boucle 'for', je crois que tu as un problème avec le comportement asynchrone de javascript, je m'explique.

    Voici ce que fait ta fonction Lance() :
    Elle déclare une fonction affich() qui ajoute Thierry, comme cette fonction est déclarée dans ta boucle for la portée de cette fonction est cantonnée à cette boucle for, c'est à dire qu'elle n'est pas déclarée à l’extérieur.
    La première itération se termine, tu peux donc considérer que la fonction affich() n'est plus accessible.
    2ème itération de la boucle, elle déclare une fonction affich() qui ajoute Linda....

    ... et ceci 4 fois.
    Une fois la boucle for terminée, elle appelle la fonction setIntervall() qui prend affich en paramètre. affich n'existe pas, donc elle te renvoie une erreur.
    Mais pour continuer dans le raisonnement, imagine que cette fonction affich soit accessible à l'appel de setIntervall(), qu'est-ce que cette fonction va ajouter à ta zone de texte ? Thierry, Linda ? Et bien ce sera Carole, et tu aura 4 fois affiché Carole sur ton écran.

    Une boucle for a un fonctionnement synchrone, ton processeur va lire la première ligne, puis la 2ème etc etc... ensuite il va recommencer ça pour la 2ème itération de la boucle, jusqu'à ce que la condition de fin soit vraie.
    setInterval a un comportement asynchrone, c'est à dire que tu demande à la fonction "Tu vas faire ça, et quand ce sera fini, tu exécutera cette fonction", en l’occurrence cette fonction à appeler s'appelle une fonction de callback, et dans ton premier extrait de code, il s'agit de Ligne().

    Tu pourrais réaliser un timer synchrone du type : for(var i...) {attendre 2secondes; ajouter tableau[i];}.
    Mais tu ne veux pas ça, parce que étant donné que c'est synchrone, pendant que tu attends 2 secondes, ton processeur ne fait plus rien, il attend les 2 secondes pour passer à la suite, en l’occurrence, ajouter un élément à ta zone de texte. En gros si pendant ce temps là tu appuie sur un bouton qui exécute un code js, genre onclick="truc()", cette fonction ne sera appelée qu'une fois que ta boucle for sera terminée, c'est à dire 8 secondes plus tard.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 82
    Points : 25
    Points
    25
    Par défaut

    Bien bien bien!!!
    Alors merci de m'avoir répondu et en grande largeur (kaari )
    Bon j'en suis au debut je voulais juste m'entraîner et glisser un setInterval pour rendre mes essais plus marrants! Donc oui Space Frog, en l'etat actuel de mes connaissances, je peux mettre une boucle un peu partout!
    Mais ça tombe bien, je commençais doucement le chapitre sur la manip du DOM je croiserai forcément ce "htmlElement#appendChild()." Merci pour la précision de la réponse en tout cas!

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par devyan Voir le message
    C'est un problème de "scope", ta fonction n'est pas visible à l'endroit où elle est appelée.

    Comme la fonction est déclarée dans la boucle for elle n'est pas visible en dehors.
    Citation Envoyé par kaari kosaku Voir le message
    Devyan a (comme toujours ;P) parfaitement raison.
    Pas toujours apparemment En JavaScript les boucles for ne modifient pas le scope.
    Voir (ou revoir) Trois fondamentaux de JavaScript.

    Citation Envoyé par kaari kosaku Voir le message
    Regarde du côté de htmlElement#appendChild().
    Je ne veux pas avoir l'air de faire une attaque personnelle, mais le site w3schools a été décrié pour son manque d'exactitude. Le MDN est une bien meilleure source, même si on ne trouve pas toujours les docs en français.




    Pour revenir au sujet, je vais aller dans le sens de ce qui a été dit : la boucle for suit le fil d'exécution principal de JavaScript, alors que les setInterval et setTimeout sont « notés » pour une exécution ultérieure. Quand un timer est enregistré, le code en cours continue immédiatement son exécution et les timers sont exécutés au plus tôt au moment où ils ont été prévus, à condition que le fil d'exécution ne soit pas occupé à ce moment. Si le fil est occupé, le timer est repoussé jusqu'à ce que le fil soit libéré.

    John Resig a expliqué en détails le fonctionnement des timers en JavaScript (c'est en anglais).

    Voici une autre façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var tableau = ['Thierry', 'Nicolas', 'Linda', 'Carole'];
     
    function affichePlusTard(index) {
       setTimeout(function() {
          var $p = document.createElement('p');
          $p.appendChild(document.createTextNode(tableau[index]));
          document.getElementById('textDiv').appendChild($p);
       }, index * 1000);
    };
    for (var i = 0, c = tableau.length; i < c; i++) {
       affichePlusTard(i);
    }
    Ici, la boucle for appelle 4 fois de suite affichePlusTard qui, comme son nom l'indique, n'affiche pas tout de suite le texte. Au lieu de ça elle lance un timer. À la sortie de la boucle for, 4 timers ont été lancés, chacun avec une durée différente : le premier à 1000 ms, le second à 2000 ms, etc.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    C'est sûr,
    je n'ai pas toujours raison (loin de là)
    D'ailleurs, j'apprends plein de choses en venant ici lire les sujets et aider quand je peux.


    Je suis d'accord, il est toujours bon de croiser les informations pour les vérifier.


    devYan.

Discussions similaires

  1. multi ouverture de la console dans une boucle for
    Par jamesleouf dans le forum C++
    Réponses: 2
    Dernier message: 16/03/2006, 21h26
  2. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo