2 votes

Ajax avec PHP et XML, getElementsByTagName problème IE

J'ai un problème avec getElementsByTagName dans IE (7 et 8).

J'ai une recherche d'adresses qui renvoie chaque adresse suggérée (sous forme de chaîne XML) dans une variable de session PHP, à laquelle on accède ensuite en utilisant une fonction AJAX qui renvoie la variable de session demandée.

Chaque variable de session est définie à l'étape 1 de la recherche d'adresse ajax (j'ai essayé sans l'encodage des caractères et avec utf-8) :

$_SESSION['addrHint_' . $k1] = '<?xml version="1.0" encoding="ISO-8859-1"?>';
$_SESSION['addrHint_' . $k1] .= '<Address>';
$_SESSION['addrHint_' . $k1] .= '<Postcode>' . $v1->Postcode . ' </Postcode>';
$_SESSION['addrHint_' . $k1] .= '<Line1>' . $v1->Line1 . ' </Line1>';
$_SESSION['addrHint_' . $k1] .= '<Line2>' . $v1->Line2 . ' </Line2>';
$_SESSION['addrHint_' . $k1] .= '<Line3>' . $v1->Line3 . ' </Line3>';
$_SESSION['addrHint_' . $k1] .= '</Address>';

Puis il est récupéré à l'étape 2 :

header('Content-Type: text/xml');
print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

Dans le js AJAX, lorsque l'état est prêt, il exécute, parmi d'autres lignes de code similaires, ce qui suit :

var xmlDoc = xmlHttp.responseXML;
var xmlRoot = xmlDoc.documentElement;
var postcode = xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue;
document.forms[0]["address"+addr+"_Postcode"].value = postcode.substring(0, postcode.length-1);

(Il fait la même chose pour chaque ligne de l'adresse.) L'extrait length-1 est là parce que j'ai dû ajouter un espace à chaque élément pour mettre fin à un problème que je rencontrais lorsqu'un élément était nul.

Cela fonctionne bien dans Firefox, mais pas du tout dans IE. J'ai depuis cherché sur Google et j'ai trouvé un certain nombre de résultats parmi les 5 premières pages, mais aucune solution. Je serais très reconnaissant si quelqu'un pouvait m'éclairer à ce sujet.

Merci d'avance.

2voto

coderjoe Points 4240

Au lieu de modifier vos valeurs de retour, vous devriez peut-être mettre en place un contrôle d'erreur autour du code qui récupère les valeurs de vos nœuds.

Si vous faites beaucoup d'enchaînements, vous ne pouvez pas vérifier les valeurs nulles. Au lieu d'enchaîner comme ceci :

xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue

Pourquoi ne pas ajouter un contrôle d'erreur au préalable ? Quelque chose comme :

var postCodes = xmlRoot.getElementsByTagName("Postcode");
if( postCodes && postCodes[0] && postCodes[0].childNodes[0] ) {
    document.forms[0]["address"+addr+"_Postcode"].value = postCodes[0].childNodes[0].childNodes[0].nodeValue;
}

De cette façon, vous ne tenterez l'assignation que s'il n'y a pas de données. Obtenir une valeur d'entrée vide là où vous l'attendez.

Tous ces enchaînements et ces instructions if peuvent devenir fastidieux. Vous pouvez donc les intégrer dans une fonction si vous le souhaitez.

N'hésitez pas à consulter un exemple concret ici : http://jsbin.com/ahidu

¡Salud!

0voto

VolkerK Points 54118

Utilisez les outils de développement d'IE (IE8 : intégré, IE7 : Barre d'outils du développeur ) pour déboguer le javascript.
Vous pouvez également ajouter quelques code de débogage de la console par exemple pour suivre l'état de la lecture.
Du côté du serveur, définissez error_reporting de php à E_ALL et surveillez le fichier error.log du serveur web (où les messages de php apparaîtront).

0voto

andres descalzo Points 8392

Print_r ???

print_r( $_SESSION['addrHint_'.$_REQUEST['addr']] );

"$ SESSION['addrHint '.$_REQUEST['addr']]" n'est pas un tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X