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 :

La variable invisible


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut La variable invisible
    Re-bonjour ,me re-voiloù :
    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
    function changeConges(formulaire)
    {
    	var mois=formulaire.mois.value;// récupérer les valeurs des champs Mois et Jour
    	var jour=formulaire.jour.value;
    	var type=formulaire.type.value;
    	// récupérer le noeud du jour ciblé
    	var TR=document.getElementById(mois);
    	var TDs=TR.childNodes;
    	for(var i=0;i<TDs.length;i++)
    	{
    		if((TDs[i]['id'])==jour)
    		{
    			TDs[i].className=type;
    			TDs[i].innerHTML=type.toUpperCase();
    		}
    	}
    }
    la variable "type" semble être une variable fantôme : rien ne change.
    Si je code en dur par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDs[i].className='ma_classe';
    			TDs[i].innerHTML='blablabla';
    tout fonctionne parfaitement

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    Là comme ça je vois pas. Ça pourrait être un conflit avec les noms de tes champs de formulaire, mais comme tu es dans une fonction et tu utilises bien var, ce n'est pas ça.

    En revanche, je vois une possible simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((TDs[i]['id'])==jour)
    Tu sélectionnes un élément par… Son id. Ça ne te rappelle pas une fonction connue ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Tu sélectionnes un élément par… Son id. Ça ne te rappelle pas une fonction connue ?
    tu penses probablement à la fonction getElementById() ;
    100% d'accord avec toi , j'améliorerai cela en temps utiles ; je vais essayer de changer le nom du champ ...

  4. #4
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    j'ai changé les noms de champs et même le nom de la variable mais toujours rien !

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 217
    Par défaut
    Bonjour,
    je ne vois pas l’intérêt de parcourir les enfants de la TR pour récupérer un seul élément via son ID, autant le faire tout de suite.

  6. #6
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    je ne vois pas l’intérêt de parcourir les enfants de la TR pour récupérer un seul élément via son ID, autant le faire tout de suite.
    Entièrement d'accord mais ce n'est pas le problème.
    Chaque chose en son temps

  7. #7
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Citation:
    je ne vois pas l’intérêt de parcourir les enfants de la TR pour récupérer un seul élément via son ID, autant le faire tout de suite.

    c'est parce qu'il existe plusieurs <td> avec le même ID

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    C'est mal !
    Un id doit être unique dans la page. Si ta page contient plusieurs id identiques, les navigateurs vont se comporter de manière indéterminée (bien que prévisible) pour essayer de satisfaire ton script. Ce n'est pas une manière stable de programmer.

    Un id doit être unique !
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 217
    Par défaut
    vérifies quand même qu'il n'y a pas un espace ou autre qui traîne, car comme l'a écrit Watilin les navigateurs vont quand même réussir là où ils nedevraient même pas essayer.

    On a le droit d'avoir plusieurs idées mais qu'un seul ID.

  10. #10
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Hola !! je suis entièrement ok avec les pratiques de bonne programmation concernant les id's uniques ou autre mais il faut avouer que ça m'arrange bougrement !
    Considérons ce bout de code :
    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 changeConges(formulaire)
    {
    	var mois=formulaire.mois.value;// récupérer les valeurs des champs Mois et Jour
    	var jour=formulaire.jour.value;
    	var g=formulaire.genre.value;
    	// récupérer le noeud du jour ciblé
    	var TR=document.getElementById(mois);
    	var TDs=TR.childNodes;
    	TDs.className=g;
    	for(var i=0;i<TDs.length;i++)
    	{
    		if((TDs[i]['id'])==jour)
    		{
    			TDs[i].className=g;
    			TDs[i].innerHTML=g.toUpperCase();
    		}
    	}
    }
    l'id recherché dans les enfants de TR est unique ;même s'il existe plusieurs id semblables dans le document.
    Sinon ,est il possible de remplacer les id's par autre chose ,comme un attribut quelconque ?
    Cela dit je ne voudrais pas paraître insolent mais je ne vois toujours pas le rapport avec la variable g et le fait que si je code en dur l'affectation de l'attribut et du texte de TDs tout fonctionne au poil !?

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Tout d'abord, sans voir le code HTML associé, il y a des choses que l'on ne peut pas voir.
    Par exemple, si le champ genre est de type radio, alors il y en a plusieurs et var g=formulaire.genre.value; n'est pas correct.

    Ensuite, tu commets de grosses erreurs.
    Non, les childNodes d'un tr, ce ne sont pas tous les td ! Ce sont les td ainsi que les différents noeuds texte qui peuvent exister dans le DOM (par exemple les sauts de lignes).
    Ensuite
    Tu ne peux pas affecter un nom de classe à une collection : donc erreur de script, il ne va pas plus loin...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(var i=0;i<TDs.length;i++)
    Là encore, dans la boucle, tu traites tous les éléments comme des éléments HTML alors que tous ne le sont pas.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  12. #12
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Non, les childNodes d'un tr, ce ne sont pas tous les td !
    c'est vrai mais les noeuds texte ne possèdent pas d'Id.
    Tu ne peux pas affecter un nom de classe à une collection
    vrai aussi mais ce n'est pas :
    mais bien :
    Là encore, dans la boucle, tu traites tous les éléments comme des éléments HTML alors que tous ne le sont pas.
    Ah bon ! de quels types d'éléments parles-tu ?

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 217
    Par défaut
    Tu peux parcourir la collection cells de la TR et faire un test sur la className.

  14. #14
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Après test des valeurs reçues par l'argument de ma fonction il se trouve que les variables mois et jour sont ok mais que g est "undefined" ; pas de bol ! c'est celle qu'il me faut ! Qui peut me dire pourquoi cette valeur de formulaire n'est pas initialisée ?
    le formulaire :
    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
    <form name="formulaire" action="http://127.0.0.1/HTML/recap.php">
    	CA<input type="radio" name="genre" value="ca"/>
    	RH<input type="radio" name="genre" value="rh"/>
    	RT<input type="radio" name="genre" value="rt"/>
    	HP<input type="radio" name="genre" value="hp"/>
    	JS<input type="radio" name="genre" value="js"/>
    	FR<input type="radio" name="genre" value="fr"/>
    	FP<input type="radio" name="genre" value="fp"/>
    	RR<input type="radio" name="genre" value="rr"/>
    	Otaf<input type="radio" name="genre" value="otaf"/><br/>
    	Mois :<input type="text" name="mois" maxlength="10" size="10"/>
    	Jour :<input type="text" name="jour" maxlength="2" size="2"/>
    	Duree :<input type="text" name="duree" maxlength="2" size="2"/><br/>
    	<button onclick="changeConges(document.formulaire);return false;">OK</button>
    </form>
    La fonction :
    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 changeConges(formulaire)
    {
    	var mois=formulaire.mois.value;// récupérer les valeurs des champs Mois et Jour
    	var jour=formulaire.jour.value;
    	var g=formulaire.genre.value;
    	window.alert('mois : '+mois+'\njour : '+jour+'type : '+g);
    	// récupérer le noeud du jour ciblé
    	var TR=document.getElementById(mois);
    	var TDs=TR.childNodes;
    	for(var i=0;i<TDs.length;i++)
    	{
    		if((TDs[i]['id'])==jour)
    		{
    			TDs[i].className=g;
    			//TDs[i].innerHTML=g.toUpperCase();
    		}
    	}
    }

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 101
    Par défaut
    Parce que formulaire.genre est un tableau

    Code Firebug : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> formulaire.genre
    [input ca, input rh, input rt, input hp, input js, input fr, input fp, input rr, input otaf]

    Il faut que tu parcoures ce tableau pour savoir lequel de ces input est checked.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 217
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Tout d'abord, sans voir le code HTML associé, il y a des choses que l'on ne peut pas voir.
    Par exemple, si le champ genre est de type radio, alors il y en a plusieurs et var g=formulaire.genre.value; n'est pas correct.

  17. #17
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Merci à Watilin qui a perçu le problème pour sa clarté !

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

Discussions similaires

  1. Contenu variable invisible avec var_dump
    Par Manuxy dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2013, 18h11
  2. Variable invisible ada
    Par walla dans le forum Ada
    Réponses: 1
    Dernier message: 19/05/2011, 11h17
  3. passer une variable invisible dans un combobox
    Par thor76160 dans le forum C#
    Réponses: 8
    Dernier message: 17/04/2009, 17h43
  4. Contenu des variable invisible dans code source
    Par Invité(e) dans le forum ASP
    Réponses: 16
    Dernier message: 05/06/2008, 13h56
  5. Variable invisible pour requête SQL !?
    Par yopuke dans le forum Langage
    Réponses: 26
    Dernier message: 11/05/2006, 16h44

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