l'asile.fr


Problème AJAX sous Firefox

Afin d'éviter de spammer la tribune, j'explique ici mon problème.

J'ai une fonction pour créer une connexion avec le serveur qui fonctionne sous IE et FF.

J'ai une fonction pour analyse la chaine XML de retour qui ne marche pas sous FF.
Elle semble bien créer l'objet mais je ne récupère pas les données.


    53  //
    54  //  Analyse d'un texte XML quelque soit le navigateur
    55  //
    56  function fnParseXML( text )
    57  {
    59
    60      if( window.ActiveXObject )
    61      {
    62         //  Sous IE
    63
    64         xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    65         xmlDoc.async="false";
    66         xmlDoc.loadXML(text);
    67      }
    68      else if( window.XMLHttpRequest )
    69      {
    70         //  Sous FireFox
    71
    72         parser=new DOMParser();
    73         xmlDoc=parser.parseFromString(text,"text/xml");
    74      }
    75      return( xmlDoc );
    76  }


   107      if (req.status == 200)
   108      {
   109
   110         //  La réponse du serveur au format XML se trouve dans la variable responseText.
   111
   112         //  Création de l'objet pour interpréter le XML.
   113         ret = fnParseXML( req.responseText );
   114
   115         //  Récupération du code de retour.
   116         oCodeRetour = ret.getElementsByTagName("CODERETOUR");
   117   alert( "oCodeRetour : " + oCodeRetour );
   118
   119         //  Si le code de retour n'est pas "OK" on affiche le libellé de l'erreur.
   120
   121         if( oCodeRetour.item(0).text != "OK" )
   122         {
   123            oLibelleRetour = ret.getElementsByTagName("LIBELLERETOUR");
   124   alert( "RetourRecherche : " + oLibelleRetour.item(0).text );
   125         }
   126         else
   127         {
   128            //  Si la réponse est "OK on parcours et insère les réponses dans une liste.


Le premier "alert" renvoi ce message : "oCodeRetour : [object HTMLCollection]"

Le second : "oCodeRetour.item(0).text : undefined"


vendredi
06 juin 2008 à 11:01
 
 

j'ai l'impression que tu utilises un parseur HTML pour FF, tu as essayé oCodeRetour.innerHTML ?


vendredi
06 juin 2008 à 11:06
 
 

tu pourais mettre un exemple de réponse envoyé ?


vendredi
06 juin 2008 à 11:08
 
 

Colle ce que retourne responseText.


vendredi
06 juin 2008 à 11:10
 
 

Pour firefox si tu n'utilise pas l'objet innerHTML cela ne peux pas fonctionner.


vendredi
06 juin 2008 à 11:12
 
 

Akshell a écrit
tu pourais mettre un exemple de réponse envoyé ?

req.responseText contient cela :

Spoiler : afficher/masquer


(faire "citer" pour voir :)


Dernière modification le 06/06/08 à 11:16 par LeChat
vendredi
06 juin 2008 à 11:15
 
 

ha non je mélange tout, donc reprenons avec nodeValue


vendredi
06 juin 2008 à 11:19
 
 

et oCodeRetour[0].firstChild.nodeValue te retourne quoi ?


vendredi
06 juin 2008 à 11:21
 
 

J'ai remplacé "oCodeRetour.item(0).text" par "oCodeRetour[0].childNodes[0].nodeValue" et ça a l'air mieux.

(ce doit être l'équivalent de ce que dit CaptNCook)


vendredi
06 juin 2008 à 11:24
 
 

C'est pas gagné :

   117
   118         //  Si le code de retour n'est pas "OK" on affiche le libellé de l'erreur.
   119
   120         if( oCodeRetour[0].childNodes[0].nodeValue != "OK" )
   121         {
   122            oLibelleRetour = ret.getElementsByTagName("LIBELLERETOUR");
   123         }
   124         else
   125         {
   126            //  Si la réponse est "OK on parcours et insère les réponses dans une liste.
   127
   128            //  Récupération du nombre de réponses = nombre de fils de LISTECD moins 2 : CODERETOUR et LIBELLERETOUR
   129
   130            oListeCD = ret.getElementsByTagName("LISTECD");
   131            iNbRep = oListeCD[0].childNodes.length;
   132   alert( "iNbRep : " + iNbRep );
   133            document.forms["BILAN"].BilanClient.options.length = 0;
   134            document.forms["BILAN"].ListeCD.options.length = 0;
   135
   136            //  Récupération des différentes réponses
   137
   138            for( i=0 ; i < (iNbRep - 2) ; i++ )
   139            {
   140               szCodeCli = ret.getElementsByTagName("CODECLI").item(i).text;
   141               szNomCli = ret.getElementsByTagName("NOMCLI").item(i).text;
   142               szNbCd = ret.getElementsByTagName("NBCD").item(i).text;

iNbRep vaut 26 pour IE et 52 pour FF !


vendredi
06 juin 2008 à 11:28
 
 

Bon, je ne sais pas comment je vais gérer le problème du iNbRep mais en tout cas ça marche.

Merci à tous.


J'ai aussi converti ces lignes

140 szCodeCli = ret.getElementsByTagName("CODECLI").item(i).text;
141 szNomCli = ret.getElementsByTagName("NOMCLI").item(i).text;
142 szNbCd = ret.getElementsByTagName("NBCD").item(i).text;


en

   144               szCodeCli = ret.getElementsByTagName("CODECLI")[i].childNodes[0].nodeValue;
   145               szNomCli = ret.getElementsByTagName("NOMCLI")[i].childNodes[0].nodeValue;
   146               szNbCd = ret.getElementsByTagName("NBCD")[i].childNodes[0].nodeValue;


Dernière modification le 06/06/08 à 11:41 par LeChat
vendredi
06 juin 2008 à 11:41
 
 

et ret.getElementsByTagName("CD").length ?


vendredi
06 juin 2008 à 11:41
 
 

chez moi iNbRep vaut 26 pour les deux, donc a priori par de problème, ensuite tes deux premiers items sont CODERETOUR, LIBELLERETOUR
donc soit tu utilises getElementsByTagName soit tu commences ta boucle a partir du troisième item.
for( i=2 ; i < iNbRep ; i++ )


vendredi
06 juin 2008 à 11:45
 
 

CaptNCook a écrit
et ret.getElementsByTagName("CD").length ?

Bisous :)


vendredi
06 juin 2008 à 11:45
 
 

Akshell a écrit
chez moi iNbRep vaut 26 pour les deux, donc a priori par de problème, ensuite tes deux premiers items sont CODERETOUR, LIBELLERETOUR
donc soit tu utilises getElementsByTagName soit tu commences ta boucle a partir du troisième item.
for( i=2 ; i < iNbRep ; i++ )

Apparemment ça fonctionne avec ma boucle "for( i=0 ; i < (iNbRep - 2) ; i++ )"

Par contre, je ne comprends pas pourquoi tu as la même valeur pour les deux et pas moi !


vendredi
06 juin 2008 à 11:48
 
 

tu peux même faire :


var cd = ret.getElementsByTagName("CD");
var codecli = ret.getElementsByTagName("CODECLI");
var nomcli = ret.getElementsByTagName("NOMCLI")
var nbcd= ret.getElementsByTagName("NBCD")

if(cd.length>0) {
  for(i in cd) {
    szCodeCli = codecli[i].childNodes[0].nodeValue;
    szNomCli = nomcli[i].childNodes[0].nodeValue;
    szNbCd = nbcd[i].childNodes[0].nodeValue;
  }
}
else {
  //rien
}


vendredi
06 juin 2008 à 11:56
 
 

Tant que je vous tiens (ou pas), vous avez une idée pour aligner des valeurs à afficher dans un "select" ?

Actuellement je fais comme ça (je sais c'est pas beau) :

   154               oNouv = new Option( "        " + szCodeCli + "           " + szNbCd + szBuf + "          " + szNomCli, szCodeCli, false, false);
   155               document.forms["BILAN"].BilanClient.options[i] = oNouv;


Ca marche sous IE (à peu près aligné) mais pas sous FF (il ne considère qu'un espace).


vendredi
06 juin 2008 à 11:56
 
 

CaptNCook a écrit
tu peux même faire :


var cd = ret.getElementsByTagName("CD");
var codecli = ret.getElementsByTagName("CODECLI");
var nomcli = ret.getElementsByTagName("NOMCLI")
var nbcd= ret.getElementsByTagName("NBCD")

if(cd.length>0) {
  for(i in cd) {
    szCodeCli = codecli[i].childNodes[0].nodeValue;
    szNomCli = nomcli[i].childNodes[0].nodeValue;
    szNbCd = nbcd[i].childNodes[0].nodeValue;
  }
}
else {
  //rien
}


Ah oui, c'est plus joli (et plus propre).

/me Léchouille CaptNCook


vendredi
06 juin 2008 à 11:58
 
 

Bon, conservatoire time. Je finirai lundi.

Merci encore à tous o/


vendredi
06 juin 2008 à 12:04
 
 

si c'est juste pour faire un select au final, tu as autocomplete basé sur scriptaculous/prototype

url : http://blog.pascal-martin.fr/post/Scriptaculous-Ajax.Autompleter-suggestions-pour-la-saisie-dune-ville


vendredi
06 juin 2008 à 12:12
 
 

Quand un nœud contient un texte trop long, il répartit le texte sur plusieurs sous nœud. Donc, il faut faire :

longtexte = xml.getElementsByTagName('longtexte').childNodes;
for(i in longtexte) {
if(longtexte[i].nodeValue != null)
document.getElementById('longtexte').innerHTML += longtexte[i].nodeValue;
}


mardi
24 juin 2008 à 13:33
 
 

Tu mets ça pour un cas que je pourrais avoir ou juste pour info ?

(en tout cas, merci de l'info :)


mardi
24 juin 2008 à 14:38
 
 

J'ai rencontré ce problème, donc je partage l'info ;)


mardi
24 juin 2008 à 14:42
 
 

Pour ton histoire d'espaces tu peux mettre des nbsp; à la place des espaces.


mardi
24 juin 2008 à 15:05
 
 

ma solution avec autocomplete tu peux mettre ce que tu veux, même des tableaux, tant que chaque ligne de données est bien un <li>


mardi
24 juin 2008 à 17:41
 
 


Répondre au sujet

Vous devez être identifié pour participer à ce topic.