11548 sujets

JavaScript, DOM et API Web HTML5

bonjour, je cherche à lire un fichier xml côté client via javascirpt.
Voici ma fonction qui permet de charger un document xml :


        function XmlDocument(path)
        {
            var xmlDoc;
	        if (document.implementation && document.implementation.createDocument)
		        xmlDoc = document.implementation.createDocument("", "", null);
	        else if (window.ActiveXObject)
		        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	        else
		        throw "erreur"
	        xmlDoc.load(path);
	        return xmlDoc;
        }


Elle fonctionne correctement sur IE quand je l'exécute en local, mais ne fonctionne plus en ligne (page de test ici : il devrait y avoir 2 alertes si ça marche).
De plus, elle ne fonctionne jamais avec Firefox.
Savez-vous pourquoi ? Auriez-vous un script qui permet de résoudre ces problèmes ?

merci d'avance pour votre aide.
Modifié par mathmax (05 Jun 2007 - 21:53)
Salut,

dans ton script il y a une contrainte que tu n'as pas intégré : le temps de chargement, et donc il faut penser à un callback lorsque le fichier xml est chargé. C'est un truc comme onload et onreadystatechange ...

Regarde la classe XHRConnection, elle comprend une méthode de chargement de fichier XML.

++
Salut mathmax,

Pour ce type de fonction (chargement de fichier externe) , le return (pourquoi?) ne marche pas, il faut utiliser une fonction "callback":

function loadXML(xml,callBack){

   if (document.implementation && document.implementation.createDocument){
      xmlDoc = document.implementation.createDocument("", "", null);
      xmlDoc.onload = function(){
         callBack(xmlDoc);
      }
   }
   else if (window.ActiveXObject){
      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.onreadystatechange = function(){
         if (xmlDoc.readyState == 4){
            callBack(xmlDoc);
         }
      }
   }
   if(xmlDoc){
      xmlDoc.load(xml);
   }
}


et ensuite tu appelles ta fonction comme ça

loadXML(fichier.xml,fonctionDeTraitementDuXml)


Bien sur il y a d'autre moyen plus élegant de faire ça notament avec les classes et les méthodes, mais je ne suis pas trés doué pour ça.

Je profite du sujet pour demander qu'elle est le plus ou le moins de cette méthode par rapport à XMLHttpRequest?
Modifié par matmat (05 Jun 2007 - 21:34)
bon on vat refaire une 20em fois le débat sur les bibliothéques, mais si mathmax veut juste charger un xml, il a pas besoin de jquery non?, 1k contre 20 il vat vite faire son choix.
Pour charger et modifier des fichiers externes, je trouve que ça correspond bien. Je l'avais regardé attentivement à l'occasion de la même question poster un peu avant et aprés reflexion j'ai trouvé ça pratique.

Il me semble que c'est plus interressant la démarche de travailler sur des fonctions de maniéres indépendantes (c'est pour ça que j'aime bien mootools), plutot que de faire des grandes bibliothéque qui font tout mais que personne ne comprend et peu faire évoluer. Du coup on se retrouve (même avec mootools) avec des truc un peu "frustrant" du fait de fonctionnement imposé par la bibliothéque. Par exemple tu veux faire un tooltip, ok tu peux mais si tu veux mettre une image un titre et un texte, tu peux plus. etc...

Peut-être 2 petites remarques pour XHRConnection:

- ne manque t'il pas les différentes version de "Microsoft.XMLHTTP"?
- la fonction setRefreshArea est elle vraiment utile, ne vaudrait-il pas mieux laisser le programeur faire ce qu'il veut avec la réponse dans sa fonction callback?

Par contre je n'ai toujours pas eu de réponse a ma question, qu'elle est l'avantage de document.implementation.createDocument sur XMLHttpRequest avec responseXML? Je te pose la question parceque dans XHRConnection tu as les deux et j'ai remarqué que XMLHttpRequest est plus fiable par exemple si on fait plusieur requetes en même temps. Donc si on a l'un est ce vraiment utile d'avoir l'autre?
Je viens de tester jquery. Merci Thanh d'en avoir parlé. Smiley smile C'est la plus belle découverte que j'ai faite en javascript ! Les sélecteurs sont tellement intuitifs... dommage que tout ceci ne soit pas en natif. J'ai seulement été un peu déçu par les performances. J'ouvre un nouveau topic pour en parler afin de ne pas polluer celui-ci.