Bonjour,

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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<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>
Fichier XML simple test.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
	<TEXT Titre="Page de test"/>
</ROOT>
Fichier XSL test.xsl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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>
Si quelqu'un a déjà rencontré ce problème ou a une idée, merci par avance