GNT sans publicité, site mobile, fonctionnalitées exclusives...

js, php et xhr : insertion xml

Le
unbewusst.sein
je construis un fragment html par DOMDocument en php :

le fichier "categories.php" :
<?php
header('Content-type: text/xml; charset=utf-8');

function add_li($doc, $ul, $idx, $name){
$li=$doc->createElement('li');
$li=$ul->appendChild($li);
$li->setAttribute('onclick', "load_items(this,
".$idx.");return false");
$li->nodeValue=$name;
return $li;
}
$doc=new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace=true;
$ul=$doc->createElement('ul');
$ul=$doc->appendChild($ul);
$ul->setAttribute('class', 'categories');

$li­d_li($doc, $ul, "-1", "Toutes");

$db=new SQLite3('../../../landp.db');
$result=$db->query('SELECT * FROM categories;');
while ($row=$result->fetchArray()) {
$li­d_li($doc, $ul, $row['idx'], $row['name']);
}
echo $doc->saveXML();
?>

si, côté js, je l'inserre comme !a (avec responseXML) :
function load_categories() {
loadXMLDoc("php/categories.php",function() {
if (xmlhttp.readyState==4 && xmlhttp.status= 0) {

document.getElementById("categories").innerHTML=xmlhttp.responseXML;
}
});
}

alors, au niveau de la fenêtre du butineur, j'obtiens :

[object Document]

est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);
???

bon par contre si dans le fichier "categories.php" je change juste le
header pour :
header('Content-type: text/html; charset=utf-8');

ie. "text/html" au lieu de "text/xml" et que l'insertion se fait par
responseText :
document.getElementById("categories").innerHTML=xmlhttp.responseText;

alors j'ai le "bon" résultat.

autrement dit, est-il possible d'inserrer une reponse xml venant de php
comme un fragment (x)html ou pas ?

--
« Si tous ceux qui n'ont rien n'en demandaient pas plus,
il serait bien facile de contenter tout le monde. »
(Coluche)
Lire les 16 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
unbewusst.sein
Le #23703321
Une Bévue
est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);
???



je viens d'essayer, !a donne que dalle o[ !!!

j'apprends par ailleurs et par hasard que « the PHP DOM interface is
highly non-standard. » et que « The "user contributed notes" are the
most useful part of the manual! ». Ce dont j'ai fait l'expérience ne
serait-ce que pour obtenir un document xhtml avec des balises link pour
le css, il faut étendre la classe DOMDocument...

see
donc, j'imagine que sauf info pertinente et contraire je dois en rester
avec "responseText" :
document.getElementById("categories").innerHTML=xmlhttp.responseText;
--
« France soir est un journal à grand tirage,
il est donc excellent pour allumer la cheminée. »
(Miguel de Cervantès)
Pascal Poncet
Le #23704811
Le 30/08/2011 17:51, Une Bévue a écrit :
est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);



Non, justement, ce n'est pas un fragment, "responseXML" représente le
document entier, auquel il faut accéder par les méthodes et propriétés
du DOM.
Fais un console.log(xmlhttp.responseXML.nodeType) et tu obtiendras la
valeur 9 ... CQFD !

Donc, si tu veux récupérer tout le contenu du document, il faut aller
chercher son élément racine qui, lui-même, contient tous ses descendants.

La solution la plus courte et naturelle est d'aller chercher la
propriété "documentElement" de ta réponse.

(dis-donc, je croyais que c'était les doigts dans le nez... ;-) )


--
Cordialement,
Pascal
unbewusst.sein
Le #23705871
Pascal Poncet
Non, justement, ce n'est pas un fragment, "responseXML" représente le
document entier, auquel il faut accéder par les méthodes et propriétés
du DOM.
Fais un console.log(xmlhttp.responseXML.nodeType) et tu obtiendras la
valeur 9 ... CQFD !



OK, merci pour le tuyau, je n'utilise pas assez ce "console.log"...

Donc, si tu veux récupérer tout le contenu du document, il faut aller
chercher son élément racine qui, lui-même, contient tous ses descendants.

La solution la plus courte et naturelle est d'aller chercher la
propriété "documentElement" de ta réponse.



OK

(dis-donc, je croyais que c'était les doigts dans le nez... ;-) )



j'ai dit !a moi ?
j'étais assez présomptueux alors...

tiens, question : je dois inserrer dans une div d'id = item, un ensemble
d'éléments qui n'ont pas de "root", je veux dire, en html, ça se
présente comme ça :
</div>
etc
</div>

donc, pour que ce soit "xmlisable" j'ai wrappé tout ça dans une div d'id
item aussi, peut-être n'est-ce pas une bonne idée ?? (le même id)

aurais-tu une meilleure idée ?

--
« Il n'existe que deux choses infinies, l'univers et
la bêtise humaine... mais pour l'univers, je n'ai pas de
certitude absolue. »
(Albert Einstein)
unbewusst.sein
Le #23706311
Une Bévue
donc, pour que ce soit "xmlisable" j'ai wrappé tout ça dans une div d'id
item aussi, peut-être n'est-ce pas une bonne idée ?? (le même id)



bon, j'ai finale mis, pour cette div, id = tmp_item, de manière à avoir
des IDs uniques...

là, côté php, si j'envoie en text/xml,
console.log(xmlhttp.responseXML.nodeType);
me dis :
null
TypeError: Result of expression 'xmlhttp.responseXML' [null] is not an
object.

et :
console.log(xmlhttp.responseXML);
me dis :
null
TypeError: Result of expression 'xmlhttp.responseXML' [null] is not an
object.

ce que je ne comprends pas vu que, si j'envoie la réponse php en
text/html et que j'inserre la div d'id tmp_item, donc envoyée par le
php, dans la div existante d'id = item, j'obtiens le "bon" résultat.
Bien évidemment à la présentation près car le css n'est pas prévu pour
l'imbrication de div id = tmp_item dans div id = item...

je fais ça juste pour mettre au point.

donc, je ne pige pas ce qui se passe quand j'envoie par php en text/xml
et que je reçois en js par responseXML...

--
« Le temps est un grand maitre, dit-on. Le malheur est
qu'il tue ses élèves. »
(Berlioz)
unbewusst.sein
Le #23706541
Une Bévue
donc, je ne pige pas ce qui se passe quand j'envoie par php en text/xml
et que je reçois en js par responseXML...



bon, je viens de faire un nouvel essai, simplement en affichant à la
console :
console.log(xmlhttp.responseText);
au lieu de responseXML.

là, j'obtiens bien :
landp.js:50 <div id="tmp_item"><div class="row_title">
...
</div></div>
ce qui était espéré, du coup, je comprends encore moins bien pourquoi
xmlhttp.responseXML est null.

à moins que ce soit ma dernière ligne de php qui soit fautive pour
envoyer du xml :
echo $doc->saveXML();
???
--
« Les femmes sont extrêmes ; elles sont meilleures ou pires que
les hommes. »
(Jean de La Bruyère)
Publicité
Suivre les réponses
Poster une réponse
Anonyme