1

J'ai un problème étrange (ou pas) avec une page web.
J'utilise un XMLHTTP sur IE6 pour délayer le chargement d'une partie d'une page web (qui liste les utilisateurs connectés à un serveur teamspeak => requète longue à effectuer, je veux pas que ça bloque le reste de la page).

Etrangement, IE semble faire la requète de manière synchrone et n'en démord pas. Le même code en remplaçant XMLHTTP par le XMLHttpRequest qui va bien fonctionne correctement.

La situation est compliquée par le fait que je n'ai pas accès au body onLoad, du coup je lance le chargement à la volée avant la fin du chargement de la page.
C'est à dire un vieux <script> dans le corps de la page qui fait ça. Je me demande si ça pourrait être à l'origine du problème ?

Evidemment je pourrais tester, mais vu comment ce truc est foutu (c'est le moteur phpbb), il y a un travail significatif à faire pour utiliser onLoad.

A tout hasard, voilà le morceau de Javascript qui fait ça :
if (window.XMLHttpRequest) {
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else {...}

httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200)  {
            updateTeamspeak(httpRequest.responseXML);
        } else {...}
    }
}

httpRequest.open('GET', 'teamspeak.php' , true);
httpRequest.send(null);
A priori c'est complètement standard.
Auriez-vous déjà rencontré le problème ? XMLHTTP aurait-il un comportement foireux quand on l'utilise avant la fin du chargement de la page ?

2

pour le coup du onload, rajoute un event dessus, comme ca se sera bon.

en javascript, c'est comme ca :


/**
 * Ajoute un événement à un objet
 * @param DOM Object
 * @param String type (load, click, etc...)
 * @param Function
 * @return bool
 */
	function addEvent(obj, evType, fn)
	{
		if (obj.addEventListener)
		{
			obj.addEventListener(evType, fn, true);
			return true;
		}
		else if (obj.attachEvent)
		{
			var r = obj.attachEvent("on"+evType, fn);
			return r;
		}
		else
		{
			return false;
		}
	}

/**
 * Retire un événement à un objet
 * @param DOM Object
 * @param String type (load, click, etc...)
 * @param Function
 * @return bool
 */
	function delEvent(obj, evType, fn)
	{
		if (obj.removeEventListener)
		{
			obj.removeEventListener(evType, fn, true);
			return true;
		}
		else if (obj.detachEvent)
		{
			var r = obj.detachEvent("on"+evType, fn);
			return r;
		}
		else
		{
			return false;
		}
	}


à utiliser comme suit :

addEvent(document.body, 'load', nom_de_ta_fonction);

sinon, il y a aussi le faite d'executer ta fonction avec un setTimeout, comme ca, celui-ci s'executera à la fin du chargement de la page. En effet, celui-ci, même si le temps indiqué est de zero, ne se lance qu'une fois la page chargé. C'est comme ca sur IE et FF en tout cas smile
Ancien pseudo : lolo

3

Pourquoi ne pas faire lancer le script qui charge a partir d'une timer comme ça sa laisse un minimum de temps pour charger la page et apriori ça devrait etre lancé de maniere asynchrone. mais apres tout IE6 n'en est peut etre tout simplement pas capable
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

4

Hmm effectivement un timer à une valeur faible c'est pas bête, j'étais tellement axé sur mon déclenchement à la volée.
Je vais tester. Et si IE6 est incapable de le gérer un asynchrone, ça se verra pas trop (sauf si l'utilisateur connait bien la page et sait direct où il va).

Mais sinon, vous avez déjà croisé ce problème, ou j'ai juste un don pour tomber sur les incohérences de IE ?

5

perso, j'utilise ca pour mes requetes, généralement, ca marche bien et c'est générique :

var http_request	= null;
var http_fonction	= null;
var http_result		= '';

function HTTPObject_reponse()
{
	if (http_request)
	{
		if (http_request.readyState == 4)
		{
			http_result	= http_request.responseText;
			if (http_function) eval(http_function);
			http_result		= '';
			http_fonction	= null;
			http_request	= null;
			return true;
		}
	}
	return false;
}

function HTTPObject_load(url, fnc)
{
	http_function	= fnc;
	
	http_request	= getHTTPObject();
	http_request.open("GET", url, true);
	http_request.onreadystatechange = HTTPObject_reponse;
	http_request.send(null);
	return true;
}


function getHTTPObject()
{
	var xmlhttp;
	/*@cc_on
	@if (@_jscript_version >= 5)
		try
		{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (E)
			{
				xmlhttp = false;
			}
      	}
	@else
	xmlhttp = false;
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
	{
		try
		{
			xmlhttp = new XMLHttpRequest();
		}
		catch (e)
		{
			xmlhttp = false;
		}
	}
	
	return xmlhttp;
}


à utiliser comme suit :

HTTPObject_load('./requete.php?toto', 'fonction_cb();');

jel'avais aussi modifié pour gérer une pile d'évenements, assez pratique, je déclencais 10 trucs d'affilé, mais ils se chargeaient les uns apres les autres, en m'affichant la ou il en était.
Ancien pseudo : lolo

6

En fait, la question qui m'intéresse, c'est de savoir, pour ton exemple, si tu as déjà eu des cas où tes requètes étaient faites de manière synchrone (en figeant le chargement de la page).

7

je ne sais pas, j'ai toujours fais mes requettes une fois le chargement terminé smile
Ancien pseudo : lolo

8

alors, tu en es ou ? t'as trouvé une solution ?
Ancien pseudo : lolo

9

Pas retouché pour l'instant. Le serveur ts répond plus rapidement, je sais pas si je verrais encore la différence. Faut attendre qu'il se remette à lagger un peu.