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 :

Probleme de variable globale ?


Sujet :

JavaScript

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut Probleme de variable globale ?
    Salut à tous,

    Voila mon but est de faire de menus déroulants liés entre eux...Alors comme je suis un brave garçon j'ai d'abord fait une recherche ici avant de poster ^^ et j'ai donc trouvé ce code qui est exactement ce qu'il me faut...


    SAUF QUE... (évidemment hein )

    dans mon cas les tableaux sont alloués dynamiquement. Donc bon je fais les modifs nécessaires.

    Au début de mon script j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var DevType = new Array(); 
    var Obj = new Array();
    qui sont mes tableaux contenus dans les 2 menus (l'équivalent de pays et ville dans l'exemple)
    Puis dans une fonction de chargement des menus je mets
    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
     
    function fctLoadDat()
    {
      DevType[0] = new Array("t0", "Account"); 
      DevType[1] = new Array("t0", "Product");
      DevType[2] = new Array("t0", "Project");
      DevType[3] = new Array("t0", "Other");
    .
    .
    .
    if (Nb != 0)
          for (i=1 ; i<=Nb ; i++)
              {
                newCpy = "ma super valeur dynamique"
                ArrayCpy[i-1] = new Array();
                ArrayCpy[i-1][0] = newCpy;
                ind = "t0o"+i;
                Obj["t0"][i-1] = new Array(ind,newCpy);
    à ce moment la mon Obj contient exactement ce qu'il faut, mais des que j'arrive dans la partie HTML qui elle ne change pour ainsi dire pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <select name="ListDevType" onChange='javascript:filltheselect(this.name, this.value)'>
       <script language="javascript">
       alert(DevType);
       for (i=0; i<DevType.length; i++)
          document.write("<option value=\"" +DevType[i][0]+ "\">" +DevType[i][1]);
       </script>
    </select>
    là on me dit que DevType n'existe pas, plus exactement que DevType[...].0 a la valeur null ou n'est pas un objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <select name="ListObj" onChange='javascript:filltheselect(this.name, this.value)'>
       <script language="javascript">
    alert(Obj["t0"]);
       for (i=0; i<Obj["t0"].length; i++)
          document.write("<option value=\"" +Obj["t0"][i][0]+ "\">" +Obj["t0"][i][1]);
       </script>
    </select>
    et idem ici pour Obj["t0"].length

    La je ne comprends pas...c'est parce que je ne suis plus dans le meme script ? il ne connait plus mes variables globales ? mais alors pourquoi ca marche dans l'exemple avec les tableaux statiques ?

    Merci d'avance si vous avez une explication (et éventuellement une solution ^^)

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 128
    Points
    128
    Par défaut Brackets
    As-tu essayé de mettre des brackets ({ et }) autour de ton "for".
    C'est + propre !

    <select name="ListDevType" onChange='javascript:filltheselect(this.name, this.value)'>
    <script language="javascript">
    alert(DevType);
    for (i=0; i<DevType.length; i++){
    document.write("<option value=\"" +DevType[i][0]+ "\">" +DevType[i][1]);
    }
    </script>
    </select>

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    bonjour,

    trois remarques :
    1. on ne peut pas dire que le document.write() soit le meilleur moyen pour créer une liste déroulante....
    2. Il manque la balise de fin des options. Syntaxe d'une liste :
      Code html : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       
      <select size="1" id="combo">
          <option selected="selected" value="">Option 1</option>
          <option value="">Option 2</option>
      </select>
    3. d'après toi dans quel ordre sont exécuter les scripts ?
      1. fctLoadDat() est appelée avant le script contenu dans le select ?
      2. fctLoadDat() est appelée après le script contenu dans le select ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    titfab + Auteur :

    ba niveau syntaxe j'ai repris tel quel le code que j'ai trouvé dans la FAQ ^^

    J'ai ajouté les brackets et les balises de fin d'options c'est vrai que c'est plus propre

    Auteur fctLoadDat est appelé onload donc avant filltheselect non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <BODY class="Dlg" onload="init()">
    et init appelle fctLoadDat

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Auteur fctLoadDat est appelé onload donc avant filltheselect non ?
    je ne faisais pas allusion à la fonction filltheselect()

    onload est un événement qui se délcenche après le chargement complet de la page.
    Voici la chronologie d'éxecution des scripts :
    1. déclaration des objets (variables globales) :
      Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
       
      var DevType = new Array(); 
      var Obj = new Array();
    2. chargement des objets contenus dans la page (tout ce qui est dans les balises body)
    3. arrivée au select, exécution de ta boucle :
      Code x : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      <select name="ListObj" onChange='javascript:filltheselect(this.name, this.value)'>
         <script language="javascript">
      alert(Obj["t0"]);
         for (i=0; i<Obj["t0"].length; i++)
            document.write("<option value=\"" +Obj["t0"][i][0]+ "\">" +Obj["t0"][i][1]);
         </script>
      </select>
    4. lorsque la page est chargée, l'événement onload se déclenche :
      1. exécution de la fonction init()
      2. exécution de la fonction fctLoadDat() et à partir de là exécution de ce code :
        Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
         
          DevType[0] = new Array("t0", "Account"); 
          DevType[1] = new Array("t0", "Product");
          DevType[2] = new Array("t0", "Project");
          DevType[3] = new Array("t0", "Other");


    tu as vu l'erreur ? Ta boucle contenue dans le seclect est exécutée avant l'appel de fctLoadDat() donc à ce moment là ton objet DevType n'existe pas...

    Regarde bien l'initialisation des variables dans le code donné dans la FAQ : aucune n'est initialisée lors d'un onload ou dans une fonction.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    d'accord !!! merci beaucoup !

    du coup si j'alimente mes select à la fin de fctLoadDat ca devrait marcher !
    j'en profiterai pour changer ces document.write et faire ca proprement :p

    je vais essayer ça ^^

    merci de ton aide !

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

Discussions similaires

  1. Probleme variables global
    Par stuffy dans le forum Général Python
    Réponses: 7
    Dernier message: 17/06/2008, 10h11
  2. problemes de variables globales
    Par mascagne dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 23/08/2007, 15h35
  3. Probleme : Variables globales pas accessible
    Par ickylevel dans le forum Général Python
    Réponses: 7
    Dernier message: 09/08/2007, 21h26
  4. probleme variable global
    Par acik59 dans le forum C
    Réponses: 9
    Dernier message: 14/05/2007, 16h34
  5. Probleme de variable globale?
    Par issam16 dans le forum Access
    Réponses: 7
    Dernier message: 01/07/2006, 17h32

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