11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je cherche à adapter PluXML en AJAX (PluXML est un système CMS sans base de donnée, en XML).
Pour ceci, j'utilise un fichier communicant "ajax.php", qui me retourne de façon dynamique les adresses des fichiers à aller chercher pour reconstituer l'article, et ce pour chaque page.

J'ai un gros problème : tout va bien jusqu'au moment où j'ouvre les fichiers retournés par "ajax.php". En effet, j'ai l'impression que JS ne veut ouvrir qu'un seul fichier : les données affichées sont les mêmes à chaque fois!

Voici le code que renvoie ajax.php :

<together>
	<file>
<fileid>0005</fileid>
<filecat>001</filecat>
<filename>article-2</filename>
</file>
	<file>
<fileid>0004</fileid>
<filecat>001</filecat>
<filename>article-1</filename>
</file>
</together>


La fonction importXML(querystring) est chargée d'importer ajax.php, puis envoie le résultat à TraiteXML() qui parse et assemble le fichier XML, pour obtenir des chaines de ce type : 0005-001-article-2.xml d'après le schéma suivant : fileid-filecat-filename.xml
TraiteXML utilise un système de boucles. A chaque itération, il reconstitue le nom d'un fichier XML, et appelle la fonction ExtractArticles(file).
Cette fonction a sensiblement le même code que importXML, sauf qu'il appelle la fonction go2html(id,nom) qui est sensée parser le document XML (xmlDoc) que lui envoie ExtractArticles et mettre le résultat dans le DIV d'ID="content".
Seulement voilà, ça ne marche que pour le premier article, le deuxième n'apparait pas.

Voilà le code XML d'un article :

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>

	<infopost>
		<title>Buts</title>
		<author>T.B.</author>
		<date>2006-01-01T00:00:00+02:00</date>
		<allow_com>1</allow_com>

	</infopost>
	<chapo>
		<![CDATA[]]>
	</chapo>
	<content>
		<![CDATA[<p>Le but de ce plugin (on va appeler ça comme ça) ce PluXML est de créer un blog en AJAX pour les passionnés Web 2.0.</p>
<p>Ce plugin a pour but de démontrer, encore une fois, la puissance du XML, qui permet de transformer un blog en une merveille de technologie 2.0, tout en gardant un côté accessible.</p>]]>
	</content>

</document>


(ne faites pas attention aux CDATA, je les enlèverai en temps voulu Smiley cligne )

Et enfin, voilà le code JS qui fâche :

function importXML(qs){
	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = traiteXML;
	}
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4) traiteXML()
		};
 	}
	else
	{
		alert('Your browser can\'t handle this script');
		return;
	}
	xmlDoc.load("ajax.php?"+qs);
}

function traiteXML()
{
	var x = xmlDoc.getElementsByTagName('file');
	var newEl = document.createElement('TABLE');
	newEl.setAttribute('cellPadding',5);
	var tmp = document.createElement('TBODY');
	var contenu = new Array();
	newEl.appendChild(tmp);
	var row = document.createElement('TR');
	for (j=0;j<x[0].childNodes.length;j++)
	{
		if (x[0].childNodes[j].nodeType != 1) continue;
		var container = document.createElement('TH');
		var theData = document.createTextNode(x[0].childNodes[j].nodeName);
		container.appendChild(theData);
		row.appendChild(container);
	}
	tmp.appendChild(row);
	for (i=0;i<x.length;i++)
	{
		var row = document.createElement('TR');
		contenu[ i]='';
		for (j=0;j<x[ i].childNodes.length;j++)
		{
			if (x[ i].childNodes[j].nodeType != 1) continue;
			var container = document.createElement('TD');
			var theData = document.createTextNode(x[ i].childNodes[j].firstChild.nodeValue);
			container.appendChild(theData);
			row.appendChild(container);
			contenu[ i]=contenu[ i] + x[ i].childNodes[j].firstChild.nodeValue + ".";
		}
		tmp.appendChild(row);
		ExtractArticles(contenu[ i] +"xml");
	}
}

function ExtractArticles(qs){
	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = function() {
			var id = qs.split(".");
			go2html(id[0],id[2]);
		};
	}
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4){
				var id = qs.split(".");
				go2html(id[0],id[2]);
			}
		};
 	}
	else
	{
		alert('Your browser can\'t handle this script');
		return;
	}
	xmlDoc.load("core/xml/" + qs);
}


function go2html(id,nom){
	var title = xmlDoc.getElementsByTagName('title');
	var author = xmlDoc.getElementsByTagName('author');
	var date = xmlDoc.getElementsByTagName('date');
	var chapo = xmlDoc.getElementsByTagName('chapo');
	var contenu = xmlDoc.getElementsByTagName('content');
	document.getElementById('content').innerHTML = document.getElementById('content').innerHTML+'<div class="post"><p class="date">' + date[0].firstChild.nodeValue.toLocaleString() + '</p><h2 class="articletitle"><a href="javascript:importXML(\'' + id + '-' + nom + '\')">' + title[0].firstChild.nodeValue + '</a></h2><p class="categorie">Cat&eacute;gorie : </p>' + contenu[0].firstChild.data;
}


Le div id="content" est donc le div où doit se retrouver le contenu de chaque fichier XML. Le div id="return" est un div de débugage dans lequel je mets toutes les informations qui peuvent être mises pour voir où ça va pas. N'y faites pas attention.
En fait, globalement, ne faites pas attention à ce qui se trouve avant ExtractArticles, je pense que tout est bon, c'est à partir de ExtractArticles que ça ne marche pas... mais je ne sais pas où Smiley decu

Merci d'avance pour votre aide!

P.S. : j'ai mis un espace dans les [ i], sinon le forum prenait ça mal...
Modifié par Ent De Kryte (15 Jul 2007 - 16:35)
Ce code dans la fonction ExtractArticles :

function ExtractArticles(qs){
	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = function() {
			var id = qs.split(".");
			alert(xmlDoc.childNodes.length);
			go2html(id[0],id[2]);
		};
	}


L'alerte me retourne d'abord 0, puis 1.
Donc, apparamment pour JS, dans le premier fichier il n'y a pas de noeud (alors qu'il y a bien un <document>[...]</document>) et dans le deuxième, qu'il y en a 1 (ce qui est vrai).
Or, les deux XML sont identiques (sauf le nom).

Où peut bien être le problème ?