Je viens demander un peu d’aide, je ne m’en sors plus et à force de trop de réflexion, je finis par faire n’importe quoi.
Après une requête asynchrone, j’essais de lire un résultat dans un script Javascript. Ce résultat sort sous forme XML.
Voici ma fonction:
function readResponse()
{
var response = xmlHttp.responseXml;
xmlRoot = response.documentElement;
}
Pour le moment, elle s’arrête là tout simplement parce qu’elle plante là lorsque je l’appelle.
Voici la réponse qu’elle est censée lire (renvoyée par un script PHP):
Quand je lance le script seul (et que je fais un echo à la place du return) je vois bien ma structure XML.
Le code retour erreur que j’ai (en javascript) est le suivant:
" response has no properties "
Voilà, j’ai cherché un peu sur le net, mais je n’ai rien trouvé pour mon cas.
J’ai tenté en mettant un header(‘Content-type: text/xml’) en début du script PHP,mais c’est peine perdue…
De toute façon, ce script est appelé via ma requête asynchrone au sein d’une page qui a déjà ses headers de définis, dont celui de Content-type en html, donc ça ne marchera pas de toute façon.
Voili voilou, en vous remerciant de l’aide que vous pourrez m’apporter.
Edité le 25/02/2008 à 11:47
Certes oui, mais n’empêche, j’ai tenté le header(‘Content-type: text/xml’) en tout début de script, mais l’erreur est toujours la même:
" response has no properties "
Faut-il que je mette la déclaration d’entête juste avant la déclaration de ma structure XML ? Je n’ai pas encore essayé (je n’ai pas les outils nécessaires pour tester chez moi). J’essaierais cela dès Lundi. mais je ne suis pas sur que ça vienne de là. J’ai donc ouvert le topic en avance de phase pour avoir d’autres pistes
Sinon c’est pas parce que le X de AJAX veut dire XML que tu es limité qu’au simple XML; tu peux envoyer du javascript, du html, du JSON et toute sorte de connerie.
JSON est tout indiqué puisque le framework prototype permet de récupérer du JSON sous forme Javascript (beaucoup plus pratique que le XML pour le coup, entre nous)
En fait, l’idée dans mon cas est assez simple. J’ai besoin de récupérer plusieurs données. Je ne peux évidement pas passer par un responseText à moins de faire mon propre parser derrière pour décortiquer les données à récupérer. Mais ça va m’alourdir considérablement le javascript
Après, dans les bouquins que j’ai lu, les deux expliquent la méthode de récupération via XML ou chaine de caractères.
Mais pas de trace de JSON ou de html ou de javascript.
Aurais-tu un court exemple à me montrer avec JSON ou récupération en javascript ?
en posant les bases suivantes pour faire simple: mon script php doit renvoyer deux paramètres (a=‘toto’ et b=‘2008’ par exemple).
tu peux valider l’intégrité du contenu XML en utilisant la classe DOMDocument, comme ça, tu t’assures que ton output est ok.
Ex:
<?php
$doc = new DOMDocument();
$text = "<rubrique>
<titre>
Accueil
</titre>
<aide>
Vous voici sur la page d'accueil,
vous pouvez naviguer dans le menu contextuel.
</aide>
<suite>
</suite>
</rubrique>";
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date du passé
header('Content-Type: text/xml; charset="UTF-8" encoding="UTF-8"');
echo $doc->saveXML();
?>
Du côté client, ça devra ressemblé à ça:
//Quand on success:
if(_xmlHttp.status == 200)
{
// assigner le fichier XML à une variable
if (window.ActiveXObject)//IE
{
doc = new ActiveXObject("Microsoft.XMLDOM");
doc.async="false";
doc.loadXML(_xmlHttp.responseText);
}else//mozilla, opera et Cie
{
doc = _xmlHttp.responseXML;
}
fetch(doc);
}
//exemple de traitement avec le document XML retourné
function fetch(doc)
{
var courant = doc.getElementsByTagName("rubrique")[0];
var helpzone = document.getElementById("texteAide");
var helpZoneTitre = document.getElementById("titreAide");
helpZoneTitre.innerHTML = courant.getElementsByTagName("titre")[0].firstChild.data;
helpzone.innerHTML = courant.getElementsByTagName("aide")[0].firstChild.data;
}
Il y a bien sur les erreurs que j’ai faite, à savoir l’oubli du header pour déclarer le Content-type qui arrive (il s’agit bien de text/xml, non de application/xml) et que aussi l’on retourne la variable non pas avec un return, mais avec un echo. Une fois réparé, ça ne fonctionnait toujours pas, toujours ce xxx has no properties.
Finalement, la lecture de mon flux XML plantait à cause de ça:
Pas bien:
var response = xmlHttp.responseXml;
Bien:
var response = xmlHttp.responseXML;
Cela dit je jetterais quand même un il à JSON, ça a l’air bien plus pratique
Oui JSON est plus pratique car tu ne passes pas/plus par une (sur)couche DOM/XML mais uniquement du JS. Le seul souci c’est que cela peut être un peu plus long que le XML (différence entre parsing JSON en JS, et parsing XML en natif)
Tu peux aussi regarder du coté GWT (google web toolkit), qui te permet de coder en php/java ton application en entier, et il compile en javascript et sérialise les classes destinées clientSide pour toi.
C’est exactement comme si tu codais en Swing.
la version 1.4 en java est compatible java 1.4, et la 1.5 arrive bientôt avec le support du 1.5 et les annotations.
Une implémentation javascript + quirk mode est faite pour chaque browser, alors la couche javascript/dom/xml, tu ne la vois carrément pas. Du moin, pas vant que tu touches au css.
Edité le 27/02/2008 à 01:32