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 :

Valeur non prise en compte dans une boucle


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arménie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut Valeur non prise en compte dans une boucle
    Bonjour,

    Dans le script, pour éviter une répétition, j'ai voulu remplacer le code par celui placé en commentaire. Ce dernier n'affiche pas le nombre souhaité.

    Auriez-vous une solution à proposer? Merci par avance pour vos réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <!DOCTYPE html>
    <html>
     
    <head><meta charset="utf-8"></head>
     
    <body>
     
    <header>
    <nav>Zéro</nav>
    <nav>Un</nav>
    <nav>Deux</nav>
    <nav>Trois</nav>
    </header>
     
    <script>
    document.getElementsByTagName("nav")[0].onclick=function() { alert(0); };
    document.getElementsByTagName("nav")[1].onclick=function() { alert(1); };
    document.getElementsByTagName("nav")[2].onclick=function() { alert(2); };
    document.getElementsByTagName("nav")[3].onclick=function() { alert(3); };
    /*
    for (var i=0;i<document.getElementsByTagName("nav").length;i++) {
    	document.getElementsByTagName("nav")[i].onclick=function() { alert(i); };
    }
    */
    </script>
     
    </body>
    </html>

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    En utilisant le JS d'aujourd'hui (ES2015), car si vous utilisez "var" au lieu de "let", "i" sera toujours égal à 4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let
      navs = document.getElementsByTagName("nav"),
      length = navs.length;
     
    for ( let i = 0; i < length; i++ ){
        navs[ i ].addEventListener( 'click', function( ev ){
     
        // debug, console, touche F12
        console.log( `nav click   : ${i}` );
     
        alert( i );
     
      }, false );
    }

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Par défaut
    Un chouilla plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (var i = 0; i < document.getElementsByTagName("nav").length; i++) {
               var vElt = document.getElementsByTagName("nav")[i];
               vElt.originalindex = i;
               vElt.onclick = function (e) {
                    alert(this.originalindex);
               };
    }

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    effectivement il s'agit d'un problème de scope bien connu , il existe bien des solutions et comme l'a dit danielhagnoul l'apport d'ES2015 est le plus avancé.

    @aloisio11 :
    il est toujours intéréssant de mettre les données en « cache », par exemple pour ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var oElem = document.getElementsByTagName('nav');
    var i, nb = oElem.length;
    for (i = 0; i < nb; i += 1) {
        oElem[i].originalindex = i;
        oElem[i].onclick = function (e) {
            alert(this.originalindex);
        };
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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