11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je viens une fois de plus vous faire part de mes problèmes de XML/XSL. Smiley sweatdrop

Je vais essayer d'expliquer clairement la situation. Sur mon site, lors du clik sur un lien, voici ce qui se passe :

1/. Un fichier XML est chargé (à l'aide de l'objet XMLHttpRequest).
2/. Un fichier XSL est chargé (à l'aide de l'objet XMLHttpRequest).
3/. Le fichier XML est transformé en XHTML grâce au XSL et le tout est affiché dans un "div".

Les chargements se font de manière synchrone et jusque là tout va bien. Cependant le mode synchrone, c'est pas ce qu'il y a de mieux pour l'utilisateur donc j'essaye d'utiliser le mode asynchrone.

Voici le code JS :
/****************************************************/
/****** Classe XMLTOOL ******************************/
/****************************************************/

// Constructeur 
// xmlURL : url du fichier xmkl source
// xslURL : url du fichier xsl source
// Le constructeur charge les 2 fichiers

function XMLTool(xmlURL,xslURL)
{
this.xml = this.loadXML(xmlURL);
this.xsl = this.loadXML(xslURL);
}

// Méthode init
// id = identifiant de l'élement dans lequel il faut mettre le HTML généré
// Construit le HTML à parir des fichiers xml et xsl et l'affiche dans l'élément ayant le id spécifié

XMLTool.prototype.init=function(id)
{
this.transform(this.xml,this.xsl,id);
}

//Méthode loadXML
// url : url du fichier à charger
// charge de manière synchrone le fichier xml ou xsl spécifié

XMLTool.prototype.loadXML=function(url)
{
try 
{

if (document.implementation && document.implementation.createDocument)
	// Cas Firefox
      {
      xmlDoc = document.implementation.createDocument('', '', null);
	  xmlDoc.async=false;
	  xmlDoc.load(url);
    }
else if (window.ActiveXObject) 
      {
      try 
	{  
        xmlDoc = new ActiveXObject('Msxml2.XMLDOM');  
	} catch (e) 
	{  
        xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); 
      	}
	xmlDoc.async = false;
	xmlDoc.load(url);
      }
else if (window.XMLHttpRequest)
	// autre ?? 
      {
      xmlDoc = new XMLHttpRequest();
      xmlDoc.overrideMimeType('text/xml');
      xmlDoc.open('GET', url, false);
      xmlDoc.send(null);
      if (this.xmlDoc.readyState == 4 && xhr.status == 200) xmlDoc = xmlDoc.responseXML;
      }
    }
  catch (e)
    {
    alert(e);
    return e;
    }

  return xmlDoc;
}

// Méthode tranform
// xml : document xml chargé
// xsl document xsl chargé
// id : id dans lequel il faut généré le HTML
// Génère le HTML et l'écrit dans l'élément spécifié par son id

XMLTool.prototype.transform=function(xml, xsl, id)
{

try {
if (window.XSLTProcessor)
	// FireFox
	{
	var xsltProcessor = new XSLTProcessor();   
	xsltProcessor.importStylesheet(xsl);
	var fragment = xsltProcessor.transformToFragment(xml, window.document);
	var target = document.getElementById(id);

	rng = document.createRange();
	rng.setStartBefore(target);
	while (target.hasChildNodes())target.removeChild(target.lastChild);
	target.appendChild(fragment);
	} else 
	if (window.ActiveXObject)
	//Windows
	{
	var target = document.getElementById(id);
	target.innerHTML = xml.transformNode(xsl);
        }
     } catch (e) 
	{
	alert(e);
    	return e;
        }

}


Et la page PHP :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-Transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head>
script type="text/javascript" src="./XMLTool.js"></script>
	<script type="text/javascript">
function go(xml_file, xsl_file) {

var a=new XMLTool(xml_file,xsl_file);
a.init('centre');

}

	</script>
</head>
<body>
<a href="javascript:go('test.xml','test.xsl')">Test</a>
</body>
</html>


Pour passer en mode asynchrone, je pensais que modifier uniquement les lignes suivantes suffirait or ce n'est pas le cas.


xmlDoc.async=false;

...

xmlDoc.async=false;

...

xmlDoc.open('GET', url, false);


Y a t-il des choses particulières à faire ?

Merci,
LoK.