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 :

Erreur de retour JS d'une checkbox


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut Erreur de retour JS d'une checkbox
    Bonjour,

    Cela fait 3 jours que je traîne ce boulet et je ne comprend pas pourquoi cela ne fonctionne pas... J'ai bien chercher dans ce forum ou sur Google si un début de réponse pouvait m'aider, mais je n'ai rien trouvé... Je me tourne donc vers vous.

    Contexte : je génère en PHP un morceau de page WEB que j'insère dans une DIV de ma page principale; ce morceau de code généré est sous cette forme :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <td colspan="2" style="border:none;">
            <input type="checkbox" name="mois_1" id="mois_1" value="1" onchange="MaJProgMois(value, 1);" checked="checked">Janvier 
            <input type="checkbox" name="mois_1" id="mois_2" value="2" onchange="MaJProgMois(value, 1);" checked="checked">Février 
    ...
            <input type="checkbox" name="mois_1" id="mois_11" value="11" onchange="MaJProgMois(value, 1);">Novembre 
            <input type="checkbox" name="mois_1" id="mois_12" value="12" onchange="MaJProgMois(value, 1);">Décembre 
    </td>

    Dans ma page principale - qui à donc "chargé" ce morceau de code - j'ai plusieurs fonctions JavaScript qui réalisent différentes choses, dont une qui est appelé si une checkbox a chang d'état (cochée ou décochée - on le voit dans le code ci-dessus : "onchange..." qui appel la fonction MaJProgMois() ).
    Ce code JavaScript est le suivant :
    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
          function MaJProgMois(valeur, id) {
     
            var str = "document.getElementsByName('mois_"+id+"')[" + valeur + "].checked";
            var check = eval(str);
     
            alert(str);
            alert(check);
     
            if (window.XMLHttpRequest) {
              xmlhttp = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
              xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
              alert("Votre navigateur ne supporte pas les fonctionnalités AJAX (=objets XMLHTTPRequest)..."); 
              return; 
            }
            xmlhttp.onreadystatechange = function() {
              if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                var retour = xmlhttp.responseText;
                document.getElementById("Debug").innerHTML = retour;
              }
            }
            xmlhttp.open("GET", "getMaJProgMois.php?mois="+valeur+"&index="+id+"&check="+check, true);
            xmlhttp.send();
          }
    Mon problème est que l'évaluation de ma chaine "document.getElementsByName("mois_1")[1].checked" par exemple, me renvoie toujours l'état initial de la case tel que décrit dans le code généré en PHP et non l'état que l'utilisateur donne à la checkbox.

    Je ne comprend pas pourquoi ! C'est pourtant "simple" JavaScript mais là, je ne vois pas pourquoi cela ne fonctionne pas... alors que dans la console JavaScript de mon Firefox, lorsque je lance un document.getElementsByName('mois_1')[1].checked par exemple, il me renvoie bien le bon booleen "true" ou "false"...

    Quelqu'un aurait il une idée ou une piste à me soumettre ? et en même temps sur quoi devrais-je partir pour avoir la bonne valeur dès qu'un clic change la checkbox

    En vous remerciant tous,

    Thierry

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Prenons ta 3e ligne de html, par exemple:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="mois_1" id="mois_1" value="1" onchange="MaJProgMois(value, 1);" checked="checked">Janvier

    value est undefined...; le paramètre ne correspond à rien dans ta page, quoi...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    ???

    Pourtant value me renvoie bien quelque chose sur ma fonction MaJProgMois()... Je récupère dans ce cas la "1"

    Idem si j'actionne la checkbox sur la ligne <input type="checkbox" name="mois_1" id="mois_2" value="2" onchange="MaJProgMois(value, 1);" checked="checked">Février : j'ai bien un retour de value qui me donne "2" dans ce cas là...
    Le problème ne me semble pas situé au niveau des valeurs qui sont renvoyées à la fonction, mais au code dans la fonction elle-même qui n'arrive pas à interpréter correctement la chaine "document.getElementsByName('mois_1')[2].checked" si on reste sur le mois de février par exemple !

    Cela fonctionne dans la console JavaScript de mon navigateur, le retour se fait bien à "true" quand je coche ou que la checbox est déjà cochée et à "false" si la checkbox est décochée ou si je la décoche.
    Je me dis donc que je tape bien sur les bons objets de la page... Alors pourquoi en transposant cette interrogation dans une fonction de ma page, cela ne fonctionne plus ???

    Je ne saisie pas là du coup ta réponse...

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bon, c'est vrai, je n'avais pas vu le reste;

    Je te propose:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <label><input type="checkbox" name="mois_1" id="mois_1" value="1" checked /> Janvier</label> 
    <label><input type="checkbox" name="mois_1" id="mois_2" value="2" checked /> Février</label> 
    <label><input type="checkbox" name="mois_1" id="mois_11" value="11" /> Novembre</label> 
    <label><input type="checkbox" name="mois_1" id="mois_12" value="12" /> Décembre</label>

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    document.getElementsByName('mois_1').forEach(v=>{
    	v.addEventListener("change",()=>{
    		console.log(v.id, " est-elle cochée? :", v.checked, "=>", v.value)
    	})
    })

    Fais F12 et regarde le résultat;

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    il y a des choses à dire comme :
    Attention les indices commence à 0 et non à 1 !

    ou encore :
    la valeur de value passée en paramètre, alors que non explicitement déclarée, se rapporte à la value de l'input par défaut si existe, c'est comme si on écrivait this.value, ce qui est d'ailleurs bien mieux, pour qu'il n'y ait pas d’ambiguïté.
    Le plus simple reste quand même, outre l'affectation en dehors du code HTML, de passer le this à la fonction et de gérer cela dans la fonction.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="mois_1" id="mois_1" value="1" onchange="MaJProgMois(this);" checked="checked">Janvier
    et dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function MaJProgMois(obj){
      const param = "mois=" + obj.value + "&index=" + obj.id + "&check=" + obj.checked;
      // le reste du code
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    il y a des choses à dire comme :
    Attention les indices commence à 0 et non à 1 !
    Oui, oui... Cela est pris en charge ailleurs dans le code JS ;-)

    Citation Envoyé par NoSmoking Voir le message
    la valeur de value passée en paramètre, alors que non explicitement déclarée, se rapporte à la value de l'input par défaut si existe, c'est comme si on écrivait this.value, ce qui est d'ailleurs bien mieux, pour qu'il n'y ait pas d’ambiguïté.
    Le plus simple reste quand même, outre l'affectation en dehors du code HTML, de passer le this à la fonction et de gérer cela dans la fonction.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="mois_1" id="mois_1" value="1" onchange="MaJProgMois(this);" checked="checked">Janvier
    et dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function MaJProgMois(obj){
      const param = "mois=" + obj.value + "&index=" + obj.id + "&check=" + obj.checked;
      // le reste du code
    }
    Ah ba ça fonctionne mieux ainsi
    Quand j'ai écrit tout cela je devais pas être réveillé

    Merci beaucoup à vous deux pour vos réponses...
    Parfois, un oeuil averti en vaut plus que 4 (oui car on était quand même 2 à regarder ce qui se passait )

    Thierry

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

Discussions similaires

  1. erreur de retour sur une boucle for
    Par cpiter dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/09/2019, 08h31
  2. [XL-2013] Erreur d'éxécution 1004 au clic d'une Checkbox
    Par Aurélien13140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/01/2017, 09h13
  3. [PR-2003] erreur de compilation avec une checkbox
    Par andri2 dans le forum VBA Project
    Réponses: 1
    Dernier message: 17/04/2013, 16h13
  4. [AC-2003] Gérer les erreurs en retour d'une requête
    Par denisw95 dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/10/2009, 13h58
  5. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16

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