Exécution Javascript dans XSL (Firefox)

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
mchaz84

Exécution Javascript dans XSL (Firefox)

Message par mchaz84 »

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 : 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>
Fichier XML simple test.xml

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
	<TEXT Titre="Page de test"/>
</ROOT>
Fichier XSL test.xsl

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>
Si quelqu'un a déjà rencontré ce problème ou a une idée, merci par avance :?

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
mchaz84

Message par mchaz84 »

Personne n'a d'idée? :oops:

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
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Eh bien, personnellement pas, mais c'est toujours plus simple d'avoir une page en démonstration (un lien, vers une page montrant ce problème). Parce que lire du code comme ça… il n'y a pas de robots sur ce forum (heureusement) :wink:

Donne un lien. Je ne pourrai pas en dire plus, mais d'autres le pourront certainement :wink:

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1
mchaz84

Message par mchaz84 »

Merci pour la réponse.
Je me demandais si justement je devais mettre un lien vers la page, mais j'étais pas sûr que ça aide beaucoup.

Donc voici un aperçu de mon problème :
http://www.spralac.com/test/default.asp

Avec IE on obtient 2 alerts, dans le bon ordre (1 puis 2). Avec FF jusqu'a 2.0.0.1 idem, et avec FF 2.0.0.2 l'ordre des alerts est inversé.

:roll:

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
chBok
Iguane
Messages : 991
Inscription : 17 oct. 2003, 19:17

Message par chBok »

Ce n'est pas simple de te répondre, car il faut analyser ton code qui semble correct.

Toutefois, j'ai fait une recherche sur bugzilla, et il semble que ton symptôme y soit mentionné. Voir les bugs suivants: https://bugzilla.mozilla.org/show_bug.cgi?id=313646 et https://bugzilla.mozilla.org/show_bug.cgi?id=337810
mchaz84

Message par mchaz84 »

Je suis allé voir les pages que t'as donné, merci.
Bon je suis pas super calé en anglais mais j'ai l'impression que leur problème décrit est un problème d'envoi et de réception de requêtes XHR. Moi il semblerait que ce soit un problème d'interprétation des balises <script> dans le fichier XSL qui est décalée. Les sujets sur le topic datent de 2005 ou 2006, or moi je n'ai le problème que depuis la sortie de la dernière version de FF le mois dernier! :cry:

Je vais quand même essayer d'analyser le code de ces pages pour voir si je peux pas en tirer quelque chose. En tout cas merci de te pencher sur mon problème :wink:

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
mchaz84

Message par mchaz84 »

Je pense avoir trouvé une piste de réponse. En séparant ma balise <script> en deux parties, le résultat est celui attendu : alert(1) puis alert(2)

Code : Tout sélectionner

<script type="text/javascript">
      transformAJAX("divsearch","test.xml", "test.xsl","get","");
      alert(2);
</script> 
devient

Code : Tout sélectionner

<script type="text/javascript">
      transformAJAX("divsearch","test.xml", "test.xsl","get","");
</script> 
<script type="text/javascript">
      alert(2);
</script> 
Cependant... quand ma fonction transformAJAX est appelée à l'intérieur d'une autre fonction, je ne peux pas scinder la balise script au milieu de ma fonction... donc je continue de chercher.

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
eisnard

Bug dans le code Javascript

Message par eisnard »

Le problème vient peut être du code Javascript lui-même. Le test
if ((cible!="")
est fait justement dans la partie Firefox et 'cible' ne semble pas initialisé.
Ce ne serait pas 's_cible' plutôt ?

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070223 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 pango-text
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités