Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con setTimeout

Estas en el tema de Problema con setTimeout en el foro de Javascript en Foros del Web. Hola a tod@s, Quisiera comentar un problema que tengo con JavaScript.. Quisiera programar un sencillo carrusel de imágenes (los efectos visuales de momento los dejo ...
  #1 (permalink)  
Antiguo 28/01/2013, 09:11
 
Fecha de Ingreso: enero-2013
Mensajes: 2
Antigüedad: 11 años, 3 meses
Puntos: 0
Pregunta Problema con setTimeout

Hola a tod@s,

Quisiera comentar un problema que tengo con JavaScript..

Quisiera programar un sencillo carrusel de imágenes (los efectos visuales de momento los dejo apartados).

El funcionamiento es bastante básico (creo), simplemente cargo en la pantalla todas las imágenes y luego con una función javascript voy modificando cual de ellas se muestra y cual se oculta.

El código HTML es el siguiente:

Código HTML:
<div id="carrusel">
	<img src="imagen1.jpg"></img>
	<img src="imagen2.jpg"></img>	
</div> 
El código JavaScript es este otro:

Código PHP:
function changeImagen(vIndex)
{
    
// Recupero todas las imagenes
    
    
var doc =  document.getElementById("carrusel");
    var 
images doc.getElementsByTagName("img");
    
    
// Recorro el array
    
for(var 0images.lengthi++)
    {
                
// Oculto todas las imágenes
        
images[i].style.display "none";    
          
                
// muestro la imagen que corresponda con la variable vIndex
        
if(== vIndex)
        {
            
images[i].style.display "block";    
        }
    }
    
    
// Contador
    
    
if(vIndex == images.length 1)
    {
        
vIndex 0;
    }
    else
    {
        
vIndex vIndex 1;
    }
    
    
    
// Llamo a la funcion con el contador incrementado

    
window.setTimeout(changeImagen(vIndex),5000);

Mi problema está en la última línea del código JavaScript:

Código PHP:
window.setTimeout(changeImagen(vIndex),5000); 
Si ejecuto este código paso a paso, hace exactamente lo que yo quiero (lo hago con el depurador de Chrome) pero si lo ejecuto libremente, la consola de JavaScript me devuelve el error "Maximum call stack size exceeded", es decir, que he llamado demasiadas veces de manera recursiva a la función.

¿Cómo puedo solventar esto?

Por otro lado, a pesar de que estoy indicando 5000 segundos de retardo en la llamada a la función, el navegador ignora ese parámetro y la llamada la hace inmediatamente....

¿Sabéis por qué puede estar provocado?

Soy algo nuevo en JavaScript y seguro que hay mil cosas que me estoy saltando...

¡Muchas gracias!

Última edición por s3rgio; 28/01/2013 a las 09:13 Razón: Mejorar estilo del mensaje
  #2 (permalink)  
Antiguo 28/01/2013, 10:00
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Problema con setTimeout

Tu problema es que no estás programando la funcion a ejecutarse en un futuro, sino que estas ejecutandola en el momento.

La firma de la funcion es setTimeout(FUNCTION, LAPSE), donde recibe FUNCTION vos le estás pasando el resultado de changeImagen y no la función en sí.

La solución? Usar una función anónima:

Código Javascript:
Ver original
  1. window.setTimeout(function() {
  2.     changeImagen(vIndex);
  3. },5000);
__________________
blog | @aijoona
  #3 (permalink)  
Antiguo 28/01/2013, 10:27
 
Fecha de Ingreso: enero-2013
Mensajes: 2
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema con setTimeout

¡Ahora funciona perfectamente!

Muchas gracias por la respuesta Aijoona.

Lo que no acabo de entender es cuando comentas

Cita:
...donde recibe FUNCTION vos le estás pasando el resultado de changeImagen y no la función en sí
¿Qué diferencia hay entra la llamada que hacía yo (donde efectivamente, se pasaba el resultado) a la llamada desde una función anónima?

Según he leido en Internet, la llamada a una función desde setTimeout debe hacerse como comentas, pero no acabo de ver el motivo..

De todas formas, muchas gracias por tu atención!
  #4 (permalink)  
Antiguo 28/01/2013, 11:23
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Problema con setTimeout

No recibe la llamada de la funcion anonima, sino LA funcion anonima.

Si vos ejecutas la funcion, va a recibir el resultado (el RETURN) de dicha funcion, en lugar de LA funcion en si.
__________________
blog | @aijoona

Etiquetas: carrousel, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:20.