yop,
Je m'essaie à ces choses-là en ce moment, histoire de voir à quoi ça ressemble. Après avoir passé une heure à trimer pour faire fonctionner un petit test, je suis curieux de voir si quelqu'un ici n'aurait pas une solution bien plus élégante que celle que j'ai été obligé d'utiliser. Je tente une présentation différente de d'habitude, je sais pas si ça sera plus clair :
Objectif :
[ul][li]Récupérer via un XMLHttpRequest une page en XHTML (générée en PHP), et ne garder de cette page qu'un élément (avec son contenu) identifié par son attribut "id"[/li][/ul]
Problèmes :
[ul][li]Les réponses des objets XMLHttpRequest sont sous forme soit de chaine de caractères (.responseText), soit d'arbre DOM (.responseXML), mais la 2eme forme n'est disponible qu'à certaines conditions (de mémoire, le content-type de la page doit être application/xml, text/xml ou application/xhtml+xml)[/li][li]Même en obéissant à cette règle, Internet Explorer a beaucoup de mal à récupérer l'arbre, ou plus précisément le document qu'il contient, supposé être dans .responseXML.documentElement[/li][li]Forcer le content-type de la page a de toutes façons d'autres effets secondaires, parfois gênants[/li][li]Firefox est capable de forcer le type mime du résultat avec la méthode overridemimetype, ce qui fonctionne à merveille, mais Internet Explorer ne sait pas faire ça[/li][li]Une autre solution envisageable serait de parser le contenu de .responseText (la chaine de caractère) pour obtenir un arbre DOM; c'est possible, mais c'est très lent et ne fonctionne pas toujours très bien avec Internet Explorer qui a besoin d'un code différent des autres navigateurs (décidément...)[/li][/ul]
Solution retenue :
[ul][li]Elle est immonde : ça consiste à créer un élement temporaire (temp = document.createElement ('div'); par exemple), puis à mettre le contenu de .responseText dans son champ innerHTML, ce qui a pour effet de parser immédiatement la chaine, puis enfin de parcourir les fils de l'élément temporaire qui contient maintenant un arbre DOM[/li][/ul]
Inconvénient :
[ul][li]Avec cette méthode, on dispose d'un objet "element" et non pas d'un objet "document", donc la méthode ".getElementById" requise pour trouver l'élément à garder dans la page (cf "Objectif", plus haut) n'est pas disponible... Ça impose de passer par des fonctions de parcours de l'arbre "faites à la main" et donc assez lentes[/li][/ul]
Serais-je passé à coté de la solution miracle ? Sachant que l'objectif ne peut pas être changé, donc par exemple faire en sorte que le script PHP ne génère que l'élément dont j'ai besoin n'est pas une solution.
Merci