J'utilise AJAX pour effectuer des transformations de documents XSL et XML pour affecter le résultat dans une DIV. Je peux faire cela en mode synchrone ou asynchrone avec des fonctions que j'ai développé (en m'inspirant de plusieurs sites).
Dans le fichier XSL, j'ai parfois du Javascript qui doit s'exécuter. Jusque là je n'ai pas eu de problème, tout fonctionnait. Mais depuis la version 2.0.0.2 de Firefox, j'ai des soucis de priorité d'exécution de script. Je m'explique avec un exemple simple :
J'ai une page qui charge un contenu de div en AJAX de manière synchrone. Pour cela j'utilise un fichier XML presque vide, et un fichier XSL presque vide aussi, mais dans lequel j'ai du javascript : alert(1);
A la suite de cette transformation j'exécute une autre instruction javascript : alert(2);
Sous Internet Explorer, le résultat est donc une boite de dialogue "1" puis "2", donc correct.
Sous Firefox j'avais le même résultat avant, mais depuis la dernière version 2.0.0.2 j'obtiens une boite de dialogue "2" puis "1". Je n'arrive pas à trouver d'où cela peut provenir.
Voici le code pour ceux qui pourraient m'aider. Mes 3 fichiers :
Fichier default.asp qui contient les fonctions JS
Code : Tout sélectionner
<html>
<head>
<script type="text/javascript">
var xhr_object = Create_XHR(); // Objet XMLHttpRequest unique
// Fonction de création de l'objet XHR
function Create_XHR()
{
var http = null;
if(window.XMLHttpRequest) // Firefox
{
http = new XMLHttpRequest();
}
else
if(window.ActiveXObject) // Internet Explorer
{
var versions = ["Microsoft.XMLHTTP","Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for (var i = 0; i < versions.length ; i++) {
try
{
http = new ActiveXObject(versions[i]);
if (http)
break;
}
catch (objException){
};
}
}
return(http);
}
// Fonction d'appel à l'objet XHR, qui renvoie un objet XML
function XHR(s_method, s_url, s_param)
{
var resp = ""; // Variable contenant la réponse XML aux requêtes
if (xhr_object != null)
{
if (s_method.toUpperCase() == "POST")
{
xhr_object.open("POST", s_url, false);
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.send(s_param);
if (xhr_object.readyState == 4)
resp = xhr_object.responseXML;
}
else
{
if (s_param != "")
s_url = s_url + "?" + s_param;
xhr_object.open("GET", s_url, false);
xhr_object.send(null);
if (xhr_object.readyState == 4)
resp = xhr_object.responseXML;
}
}
else
alert("Erreur");
return(resp);
}
// Fonction de transformation XML/XSL synchrone
function transformAJAX(s_cible,s_xml, s_xsl, s_method, s_param)
{
try
{
// Partie Firefox
if (window.XSLTProcessor)
{
var xslStylesheet, xmlDoc;
var xsltProcessor = new XSLTProcessor();
xslStylesheet = XHR("GET", s_xsl, "");
xsltProcessor.importStylesheet(xslStylesheet);
xmlDoc = XHR(s_method, s_xml, s_param);
var fragment = xsltProcessor.transformToFragment(xmlDoc, document);
if ((cible!="")&&(document.getElementById(s_cible)))
{
var cible = document.getElementById(s_cible);
cible.innerHTML="";
cible.appendChild(fragment);
}
else
{
var tmpElement = document.createElement('div');
tmpElement.appendChild(fragment);
document.write(tmpElement.innerHTML);
}
}
// Partie Internet Explorer
else if (window.ActiveXObject)
{
var docXML = XHR(s_method, s_xml, s_param);
var docXSL = XHR("GET", s_xsl, "");
if (s_cible!="")
{
var cible = document.getElementById(s_cible);
cible.innerHTML = docXML.transformNode(docXSL.documentElement);
}
else
document.write(docXML.transformNode(docXSL.documentElement));
}
}
catch (e)
{
alert(e.description);
return e;
}
}
</script>
</head>
<body>
<div id="divsearch"></div>
<script type="text/javascript">
transformAJAX("divsearch","test.xml", "test.xsl","get","");
alert(2);
</script>
</body>
</html>
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<TEXT Titre="Page de test"/>
</ROOT>
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<div>
<xsl:value-of select="/ROOT/TEXT/@Titre"/>
</div>
<script type="text/javascript" defer="true">
alert(1);
</script>
</xsl:template>
</xsl:stylesheet>

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2