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


mardi
24 juin 2008 à 17:41
 
 


Répondre au sujet

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