Jump to content

Problème de requêtes synchrones avec firefox


gyan000

Recommended Posts

Bonsoir,

Alors voilà, j'ai un petit soucis.

Imaginez une liste déroulante basique avec divers artistes.

A la sélection d'un artiste, quatre autres listes déroulantes se remplissent.

Une pour les clips de l'artiste, l'autre pour les lives etc..

Jusque là, rien de sorcier, j'effectue une requête synchrone pour interroger ma base de données, je récupère le résultat formaté en XML avec une fonction javascript qui utilise le DOM pour modifier le contenu d'un DIV.

Tout cela fonctionne très bien avec IE 6, 7, Opera, Konqueror... (et ça ne fonctionne qu'en mode synchrone)

Mais, parceque sinon ce n'est pas drôle... avec firefox, de base, cela ne fonctionne pas.

Par contre, si vous installez l'extension firebug, c'est ok.

Pour remplir ces quatre listes, dans la balise <SELECT> de la liste contenant les artistes, j'utilise l'évènement onChange et dans celui-ci je fais appel quatre fois à la même fonction, ce qui me donne dans le code source quelquechose de ce genre :

onChange = "httpRequest (arguments), httpRequest (arguments), httpRequest (arguments), httpRequest (arguments);"

Tout ce que je constate, c'est que firefox exécute bien les scripts php permettant de récupérer les contenu des listes mais il ne met pas à jour les balises <DIV>. En fait, je me suis rendu compte qu'il n'exécute pas la fonction javascript permettant justement de modifier le contenu des <DIV>

Par contre, si je n'ai qu'une seule requête asynchrone à effectuer pour remplir qu'une seule liste, par exemple, ça fonctionne. Mais si je passe en mode synchrone, hop, ça fonctionne plus non plus.

Et en mode asynchrone, j'ai constaté qu'il n'y a que la dernière liste déroulante qui se complète proprement.

Ce que j'aimerai comprendre aussi, c'est pourquoi quand on active l'extension firebug, ça fonctionne correctement...

L'exemple est ici.

Bon, bien sûr, si je n'arrive pas à trouver de solution, je ferai en sorte d'appeler un seul script php qui me générera les quatre listes déroulantes que j'insérerai dans un seul <DIV> mais...., ça m'énerve un peu de ne pas comprendre d'où peut venir le problème.

Si vous avez des idées...

Ci-dessous, les deux fonctions de base permettant d'effectuer des requête a/synchrones et d'appeler la fonction javascript qui traitera le résultat, c'est basique.

var request = null;

function httpRequest (reqType, url, asynch, respHandle) {
// Navigateurs basés sur Gecko...
if (window.XMLHttpRequest) {
	request = new XMLHttpRequest ();
}

// ... et Internet Explorer.
else if (window.ActiveXObject) {
	request = new ActiveXObject('Msxml2.XMLHTTP');

	if (!request) {
		request = new ActiveXObject('Microsoft.XMLHTTP');
	}
}

// On vérifie si la requête n'est pas nulle dans le cas où aucun ActiveXObject  n'aurait été initialisé.
if (request) {

	// Si le paramètre reqType est POST, alors le cinquième argument  de la fonction correspond aux données POSTées.
	if (reqType.toLowerCase() != 'post')  {
		initReq(reqType, url, asynch, respHandle);
	}

	else {
	// les données POSTées.
	var args = arguments[4];

		if (args != null && args.length > 0)  {
			initReq(reqType, url, asynch, respHandle, args);
		}
	}
}

else {
	alert ('httpRequest()\n\n Votre navigateur ne permet pas l\'utilisation\n de toutes les fonctionnalités de cette application.');
}
}

function initReq (reqType, url, bool, respHandle) {

try {

// Sert à  préciser la fonction qui traitera la réponse HTTP.
request.onreadystatechange=respHandle;
request.open(reqType, url, bool);

	// Si le paramètre reqType est POST, alors le cinquième argument de la fonction correspond aux données POSTées.
	if (reqType.toLowerCase() == 'post') {
		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
		request.send(arguments[4]);
	}

	else {
		request.send(null);
	}
}

catch (errv) {
	alert ('initReq()\n\n L\'application ne parvient pas à contacter le serveur actuellement.\n Veuillez essayer à  nouveau dans quelques instants.\n Détails de l\'erreur :\n\n' + errv.message);
}
}

Link to comment
Share on other sites

Effectivement, quand on clique sur un artiste, 4 requêtes sont envoyés à remplirListeBonus.php5 et la console n'enregistre aucune erreur...

A priori donc, le code que nous a copié ici et qui sert à envoyer les requêtes fonctionne correctement.

En fait ce qu'il faudrait voir, c'est la fonction "respHandle" qui doit servir à traiter les résultats de la requête et peupler les listes...

Link to comment
Share on other sites

Je te remercie d'avoir pris un peu de temps pour t'intéresser à mon problème.

Voici donc la fonction javascript permettant d'afficher un contenu.

Je récupère le contenu à afficher (de l'HTML tout simple) et le l'ID du DIV qui recevra ce contenu.

Un simple appel à innerHTML est c'est tout, je ne pense pas qu'on puisse faire plus simple que ça.

C'est vraiment incompréhensible... :-D

16 function afficherContenuTraiteReponse () {
17	try {
18	   if (request.readyState == 4) {
19		  if (request.status == 200) {
20
21			 var docXML = request.responseXML;
22			 // Variable contenant le contenu à afficher.
23			 var contenuXML = docXML.getElementsByTagName('contenu');
24			 var contenu = contenuXML.item(0).firstChild.nodeValue;
25
26			 // Variable contenant le nom du DIV dans lequel il faut afficher la liste.
27			 var contenuIDXML = docXML.getElementsByTagName('contenuID');
28			 var contenuID = contenuIDXML.item(0).firstChild.nodeValue;
29
30			 // On se sert de innerHTML pour affichertout ça.
31			 document.getElementById(contenuID).innerHTML = contenu;
32		  }
33
34		  else {
35			 alert ('afficherContenuTraiteReponse()\n\n Un problème de communication est survenu entre l\'objet XMLHttpRequest et le programme côté serveur.');
36		  }
37	   }
38	}
39
40	catch (errv) {
41	   alert ('afficherContenuTraiteReponse()\n\n L\'application ne parvient pas à contacter le serveur actuellement.\n Veuillez essayer à  nouveau dans quelques instants.\n Détails de l\'erreur : \n\n' + errv.message);
42	}
43 }

Link to comment
Share on other sites

  • 3 months later...

Bonsoir,

Et non, je n'ai pas résolu mon soucis, mes scripts sont effectivement corrects.

C'est tout simplement parceque firefox a un problème avec les requêtes synchrones multiples.

Un bug qui date de fin 2005 et qui n'est pas résolu semble-t-il.

--> bug 313646

Link to comment
Share on other sites

En fait, le plus énervant c'est que cette fonction est très bien implémentée dans tout les autres navigateurs du marché (même IE 5) sauf lui ! C'est un comble quand même, moi qui passe mon temps à recommander firefox à droite à gauche. Dorénavant je recommanderai Opera. ( ou même IE 7, soyons fou !)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...