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 :

Branchement conditionnel if avec l'opérateur == sans effet


Sujet :

JavaScript

  1. #1
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut Branchement conditionnel if avec l'opérateur == sans effet
    Bonjour ,

    je passe la fonction suivante

    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
     
    function actualisation(data)
    { 
    	alert("data avant test = " + data);  //Affiche bien "btp_on" ou "btp_off" en fonction du retours du "callback"
     
    	if (data == 'btp_on')  //Ne fonctionne pas même quand data = btp_on 
    	{
    		alert("data if btp_on = " + data);  //Ne s'affiche jamais
    		document.getElementById("btn_ter_princ_on").background = rgb(255,200,100);
    		document.getElementById("btn_ter_princ_off").background = rgb(100,200,100);
    	}
    	else if (data == 'btp_off')   //Ne fonctionne pas même quand data = btp_off
    	{
    		alert("data if btp_off = " + data);  //Ne s'affiche jamais
    		document.getElementById("btn_ter_princ_on").background = rgb(80,150,80);
    		document.getElementById("btn_ter_princ_off").background = rgb(80,150,80);
    	}
    	else alert('Les comparaisons ne fonctionnent pas');  //S'affiche bien à chaque appel de la fonction avec data = btp_on ou data = btp_off
     
    	alert("data après test = " + data);  //Affiche toujours bien "btp_on" ou "btp_off" en fonction du retours du "callback" (pas de modification)
    }
    en callback à une requête AJAX. Elle ne fonctionne pas. Et pourtant, "data" reçoit bien la réponse "xhr.responseText" ainsi qu'en attestent les commentaires que j'ai indiqué dans le code. Je m'arrache un peu les cheveux car je ne vois pas où peut être l'erreur dans un code aussi banal. Ce doit être une bêtise énorme mais je ne la vois pas .

    Si quelqu'un pouvait me dire où est le hic avant que Yul Brinner ne m'attaque pour plagiat , je lui en serais bigrement reconnaissant.

    J'ai hésité avant de poster ici plutôt que sur le forum AJAX mais il me semble que c'est plus un problème javascript, la requête proprement dite étant parfaitement opérationnelle, bien que le dysfonctionnement du branchement m'empêche d'en utiliser les résultats pour mettre à jour le style de ma page.

    Merci d'avance,

    naute

  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 : 73
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Le problème vient certainement du contenu de data. Ce doit être du texte : "btp_on" ou "btp_off".

    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
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    si tu peux modifier ça coté serveur
    retourne { "btpIsOn" : true } ou { "btpIsOn" : false }.

    si tu est en php je suppose que tu as quelque chose comme isOk() une fonction retourne un booléen en fonction de ce qui doit être fait
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isOk()) {
      echo "btp_on";
    } else {
      echo "btp_off";
    }
    fais
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $resultat = array("btpIsOn" => isOk());
    echo json_encode($resultat);//retourne { "btpIsOn" : true } ou { "btpIsOn" : false }

    dans ta callback
    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
    function actualisation(data)
    { 
      alert("data avant test = " + data);  //Affiche bien { "btpIsOn" : true } ou { "btpIsOn" : false } en fonction du retours du "callback"
      var result= JSON.parse(data);
     
      //if (data == 'btp_on')  //Ne fonctionne pas même quand data = btp_on 
      if (reslut.btpIsOn) //reslut.btpIsOn est un booléen il vaut true ou false
      {
        alert("data if btp_on = " + data);  //Affiche bien { "btpIsOn" : true }
        document.getElementById("btn_ter_princ_on").background = rgb(255,200,100);
        document.getElementById("btn_ter_princ_off").background = rgb(100,200,100);
      }
      //else if (data == 'btp_off')   //Ne fonctionne pas même quand data = btp_off
      else // c'est un booléen donc obligatoirement true ou false donc pas besoin de elsieif
      {
        alert("data if btp_off = " + data);  //Affiche bien { "btpIsOn" : false }
        document.getElementById("btn_ter_princ_on").background = rgb(80,150,80);
        document.getElementById("btn_ter_princ_off").background = rgb(80,150,80);
      }
      //else alert('Les comparaisons ne fonctionnent pas');  //S'affiche bien à chaque appel de la fonction avec data = btp_on ou data = btp_off
      // il est impossible d'avoir une troisième possibilité
     
      alert("data après test = " + data);  //Affiche bien { "btpIsOn" : true } ou { "btpIsOn" : false } en fonction du retours du "callback"
    }
    evite au max d'utiliser de simple string pour transporter de telles valeurs il est préférable d'utiliser un formalisme comme JSON ou XML
    A+JYT

  4. #4
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour et merci pour vos réponses.

    J'aurais peut-être dû préciser que mon architecture est un peu particulière. Le client est bien un navigateur lambda sur PC, tablette ou autre, mais le serveur, très simple, est implémenté sur un micro-contrôleur (système Arduino). Je code donc entièrement la gestion des requêtes (selon le protocole HTTP bien sûr) et je renvoie, par conséquent ce que je veux. En l’occurrence, je renvoie bien du texte, lequel est réceptionné dans xhr.responseText. Quand je fais un alert("responseText="+responseText); , j'ai bien le popup qui s'affiche dans mon navigateur, avec la phrase responseText=toto (si j'ai envoyé "toto" évidemment), de même que quand je fais un alert("data="+data);, sauf dans le test "if", tout s'affiche correctement, ce qui, me semble-t-il, est la preuve à la fois que le système fonctionne et que "l'objet" reçu est bien du texte.

    Donc, en ce qui concerne
    Citation Envoyé par danielhagnoul Voir le message
    Le problème vient certainement du contenu de data. Ce doit être du texte : "btp_on" ou "btp_off".
    à mon avis, puisque "alert()", qui n'accepte que du texte comme argument, fonctionne, c'est bien, à priori, qu'il reçoit du texte. Par contre, je me demande si le codage (ici utf-8 sans BOM) peut entraîner un dysfonctionnement. Qu'en penses-tu?

    Citation Envoyé par sekaijin
    si tu est en php je suppose que tu as quelque chose comme isOk() une fonction retourne un booléen en fonction de ce qui doit être fait
    Eh non, c'est plutôt du C++. En ce qui concerne l'utilisation de JSON ou du XML, cela me semble disproportionné en raison du peu de données que j'ai à traiter d'une part, et d'autre part je dois tenir compte du peu de mémoire dont je dispose (32Ko de flash pour le programme et 2Ko de RAM) sur le serveur. De plus, en ce qui concerne JSON, il s'agit également de Strings (puisque récupérées aussi dans responseText) qu'il faut traiter après réception, sauf erreur. Or, si on peut traiter des Strings au "format" JSON, j'imagine que l'on peut également traiter des Strings toutes bêtes, même si l'utilisation de JSON ou du XML est préférable dans la majorité des cas.
    Par contre, je vais voir si je peux m'inspirer de ton exemple pour faire mon test sur un booléen plutôt que sur une chaine, mais je ne vois pas encore comment, dans la mesure où je ne peux pas récupérer directement un booléen dans responseText et que, pour lui donner une valeur après réception, il faut bien que je fasse un test sur la chaine reçue. C'est le chat qui se mord la queue.

    Cependant, j'ai l'impression que le problème ne vient pas vraiment de là. "data" contient bien, à priori, du texte (mais comment en être sûr?), et je le compare à un texte codé "en dur", mais tout se passe comme si les deux texte étaient différents, non pas par leur contenu affichable, mais... je ne sais pas: leur codage, peut-être, ou un caractère non affichable, genre 0 terminal ajouté à la chaine transmise, mais pris en compte lors de la comparaison, et faisant échouer celle-ci. Ce qui rejoint l'avis de danielhagnoul: je pense que c'est bien du texte, mais qu'il y a un truc qui cloche à ce niveau. Il faudrait une procédure genre trim() pour débarrasser la chaine reçue de tout ce qui aurait pu lui être ajouté, si, bien sûr, c'est le cas, mais je ne sais pas comment mettre ça en évidence. Enfin bref! Je nage .

    En tout cas, merci encore pour vos réponses ,

    naute

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2014
    Messages
    388
    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 : 388
    Points : 578
    Points
    578
    Par défaut
    Bonjour,

    Voici quelques pistes :

    1°) Il y a peut-être un caractère espace en trop, que l'on peut voir avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert("début" + data + "fin");
    2°) Sinon, plusieurs caractères UTF8 différents ressemblent au caractère "souligné bas". A vérifier donc, par exemple en utilisant document.write() à la place de alert() et en faisant un copier-coller.

    3°) On doit également pouvoir tester chaque caractère de la chaîne de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    caractere=data.substring(1,2);
    if (caractere=="t") alert("ok pour le 2ème caractère");
    ...

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    ..si, bien sûr, c'est le cas, mais je ne sais pas comment mettre ça en évidence.
    souvent un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function actualisation(data) { 
        console.log( data.split(''));
        // ou un
        console.log( data.length);
    suffit à mettre en évidence un caractère « caché ».

    Tu peux également tester via un indexOf().

  7. #7
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour,

    Citation Envoyé par eleydet Voir le message
    ... plusieurs caractères UTF8 différents ressemblent au caractère "souligné bas"...
    J'ai testé en remplaçant btp_on et btp_off par btpOn et btpOff: pas de changement.

    Par contre, j'ai essayé ton autre idée:
    Citation Envoyé par eleydet Voir le message
    ...Il y a peut-être un caractère espace en trop, que l'on peut voir avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert("début" + data + "fin");
    en encadrant mon data avec deux # (je suis un peu fainéant )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert("#" + data + "#");
    et là, pas d'espace en trop, mais le second # se retrouve à la ligne suivante. Un retour chariot a donc été ajouté à ma chaine.

    J'ai également utilisé l'idée
    Citation Envoyé par NoSmoking
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function actualisation(data) { 
        console.log( data.split(''));
        // ou un
        console.log( data.length);
    en faisant simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert(data.length);
    pour voir, et là, j'ai deux caractères en trop: 7 pour btpOn et 8 pour btpOff. J'imagine une fin de ligne avant le retour chariot, assez classique.

    J'ai donc changé mon test en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (data.indexOf('btpOn') > -1)
    et bingo! le test est opérationnel. Cela dit, mon actualisation ne se fait pas, et il y a donc un autre hiatus. Mais comme maintenant mon branchement fonctionne, je vais pouvoir m'attaquer à ce problème.

    Alors beaucoup à tous et

    naute

  8. #8
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Je persiste meme en cpp ça coute rien de retourner '{«btp»:true}'

    Et tu est sur a 100% d'éliminer les caractères parasites

    Si un cr ou crlf ou lf ou quoi que ce soit se glisse quelque par de tout façon le JSON.parse de js ne le prendra pas en compte.

    Ça fait 6 caractères de plus a taper. Meme sur arduino c jouable

    A+

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    j'ai deux caractères en trop:...
    • Le mieux restant de supprimer ces caractères à la source.
    • Le mieux du mieux restant de passer par un objet JSON comme signalé par sekaijin.

  10. #10
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    OK! OK! OK! .

    Citation Envoyé par sekaijin Voir le message
    Je persiste meme en cpp ça coute rien de retourner '{«btp»:true}'
    A+
    Citation Envoyé par NoSmoking
    Le mieux du mieux restant de passer par un objet JSON comme signalé par sekaijin.
    Bon! Je vais me plonger dans le formalisme JSON que je ne connais que très vaguement (comme XML d'ailleurs). De toute manière, faire travailler sa cervelle en apprenant de nouvelles choses permet de retarder le gâtisme (enfin, j'espère ). C'est d'ailleurs un peu pour ça que je me suis mis à AJAX (le premier qui dit WC risque de faire un four ( c'est pitoyable)) car mon système d'actualisation fonctionnait très bien avec de simples rafraichissements de page.

    Merci et à bientôt

    naute

  11. #11
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    explication simple et rapide
    http://json.org/

    A+JYT

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

Discussions similaires

  1. Modifications dans tableau avec 2 foreach sans effet
    Par EIN-LESER dans le forum Langage
    Réponses: 3
    Dernier message: 23/10/2013, 15h12
  2. Réponses: 6
    Dernier message: 18/06/2012, 09h54
  3. SET NOCOUNT sans effet avec exec master..xp_fileexist
    Par droog dans le forum Développement
    Réponses: 13
    Dernier message: 16/06/2011, 09h56
  4. Branchement conditionnel avec script java
    Par remys dans le forum Pentaho
    Réponses: 5
    Dernier message: 01/02/2011, 14h35
  5. Lancer des effets avec Action Script, sans changer d'état
    Par black is beautiful dans le forum Flex
    Réponses: 4
    Dernier message: 24/02/2010, 09h24

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