Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/10/2010, 03:00
xenon254
 
Fecha de Ingreso: noviembre-2007
Ubicación: Zamora (Spain)
Mensajes: 251
Antigüedad: 16 años, 5 meses
Puntos: 1
Precarga de imágenes dentro de una función Ajax

Hola a todos,

He dado bastantes vueltas a estas líneas para que me realice una operativa que a priori debería ser bastante simple pero no lo he conseguido realizar.

1. Solicita a un fichero llamado auth.inc.php que realice unas validaciones de usuario y cree unas variables de sesión, (funciona OK). También que lea un directorio de imágenes para que devuelva una cadena con los nombres (imagen1.jpg,imagen2.jpg,imagen3.jpg,...). También funciona OK.

2. Si el fichero php no devuelve mensaje de error divide la cadena recibida usando de separador una coma (,) y guarda los resultados en el array 'imagenes'.

3. Realiza la operativa de la precarga recorriendo todas las imágenes.

4. Al final y conociendo por experiencia que se han descargado todas las imágenes se envía ese array a la función testLoaded() para que lo vuelva a recorrer.

5. Si encuentra una imagen no cargada vuelve a llamar a la función con un setTimeOut a los 10milisegundos.

6. De esta manera recursiva, en teoría, debería estar realizada la carga de todos los ficheros para luego proceder finalmente a dirigirse a otra página.

---------

Pues bien, no funciona. Me pienso que no es capaz de interpretar el setTimeOut y que no lo hace..

Agradezco mucho cualquier indicación que se me haga.

Código:
function nuevoAjax(){
	var xmlhttp = false;
	try{
	  xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
	} 
	catch(e){
		try{
			xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
		}
		catch(E){
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') 
		xmlhttp = new XMLHttpRequest();
	return xmlhttp;
}

function testLoaded(imgs){
	var i;
	for(i in imgs)
		if (!imgs[i].complete)
			setTimeout('testLoaded('+imgs+')', 10);
	window.location.replace('inicio.html');
}

function auth(){
	var f = document.formulario;
	c = document.getElementById('status');
	
	user=f.user.value;
	pass=hex_sha1(f.pass.value);
	
	ajax=nuevoAjax();
	c.innerHTML = 'Validando...
	ajax.open("POST", "includes/auth.inc.php",true);
	ajax.onreadystatechange=function(){
		if (ajax.readyState==4)
		    if (ajax.status==200){
				if (ajax.responseText == 'Err 1')
					c.innerHTML = 'Login y/o Pass incorrectos.';
				else if (ajax.responseText == 'Err 2')
					c.innerHTML = 'Se ha producido un error';
				else{
					c.innerHTML = 'Cargando inteface';
					var imagenes = ajax.responseText.split(",");
					var i;
					var lista_imagenes = new Array();
			
					for(i in imagenes){
						lista_imagenes[i] = new Image();
						lista_imagenes[i].src = 'images/'+imagenes[i];
					}
					testLoaded(lista_imagenes);
				}
			}
	}
	ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	ajax.send("user="+user+"&pass="+pass);
}