Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Rotador de imagenes en Javascript se vuelve loco

Estas en el tema de Rotador de imagenes en Javascript se vuelve loco en el foro de Javascript en Foros del Web. HOYGAN! ayudenmen con este codigo, es un rotador de imagenes sencillo, no quiero hacerlo muy complicado, simplemente un timer que cambie cada 10 segundos la ...
  #1 (permalink)  
Antiguo 27/05/2014, 16:15
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Rotador de imagenes en Javascript se vuelve loco

HOYGAN! ayudenmen con este codigo, es un rotador de imagenes sencillo, no quiero hacerlo muy complicado, simplemente un timer que cambie cada 10 segundos la propiedad display de una imagen, es decir que por 10 segundos este en block y de ahi pase a none y asi por los siglos de los siglos...

El codigo es este:

Código Javascript:
Ver original
  1. function rotateImages()
  2.       {
  3.         var imageContainer = document.getElementById("slider_images");
  4.         var imageList = imageContainer.getElementsByTagName("img");
  5.        
  6.         for (i = 0; i < imageList.length; i++){
  7.           if (!imageList[i].style.display){
  8.             imageList[i].style.display = "block";
  9.             setTimeout(rotateImages,10000);
  10.           }else{
  11.             if (imageList[i].style.display == "block"){
  12.               imageList[i].style.display = "none";
  13.               i++;          
  14.             }else{
  15.               imageList[i].style.display = "block";
  16.             }
  17.             setTimeout(rotateImages,10000);
  18.           }
  19.         }
  20.       }

Como ven es muy sencillo, a las primeras rotaciones lo hace bien, pero cuando tiene que repetir la secuencia de imagenes se vuelve loco y pone los display como le viene en gana, quiero evitar ese comportamiento y que respete la secuencia.

¿Cómo hacer?
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #2 (permalink)  
Antiguo 27/05/2014, 17:08
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Empezaria mas o menos asi:

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <title>Test de @Italico76</title>
  4. <style>
  5.     body {background-color: #000;} 
  6.  
  7.     #slider_images
  8.    {
  9.         width:350px;
  10.         height:350px;
  11.         background-color: #bbb;
  12.         border: red 2px;
  13.         position:relative;
  14.    }
  15.    
  16.    img {display:none;}
  17.    
  18. </style>
  19. </head>
  20. <body>
  21.  
  22. <div id="slider_images">
  23.    <img src="images/2.jpg" width="150px" height="150px"/>
  24.    <img src="images/3.jpg" width="150px" height="150px"/>
  25.    <img src="images/4.jpg" width="150px" height="150px"/>
  26.    <img src="images/5.jpg" width="150px" height="150px"/>
  27.    <img src="images/6.jpg" width="150px" height="150px"/>
  28. </div>
  29.  
  30.  
  31. <script>
  32.     function init()
  33.     {
  34.         var imageContainer = document.getElementById("slider_images");
  35.         var imageContainerChilds = imageContainer.childNodes;          
  36.        
  37.         var img_cont = 0;
  38.         var img_contenedor_new = new Array;
  39.        
  40.         for (i = 0; i < imageContainerChilds.length; i++)
  41.         {
  42.             // me quedo solo con las etiquetas <img>
  43.             if (typeof(imageContainerChilds[i].src) !='undefined')
  44.             {
  45.                 // les asigno id para identificarlas (no se si tenian!)
  46.                 imageContainerChilds[i].id=img_cont;
  47.                 img_cont++;                
  48.             }
  49.         }      
  50.     }
  51.      
  52.     function rotateImages(){
  53.         // hacer!
  54.     }    
  55.      
  56.     window.onload = function()
  57.     {
  58.         init();
  59.         rotateImages();
  60.     }
  61. </script>
  62. </body>
  63. </html>
__________________
Salu2!
  #3 (permalink)  
Antiguo 27/05/2014, 17:12
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Eso sucede porque el contador nunca retorna al principio, siempre aumenta a pesar de que haya sobrepasado la cantidad de imágenes. Este ejemplo te puede servir.

Por cierto, se escribe OIGAN y AYÚDENME.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #4 (permalink)  
Antiguo 27/05/2014, 17:53
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Rotador de imagenes en Javascript se vuelve loco

@Alexis88 : compañero en JS si que ando mal


1 .- En este mismo problema no me ha funcionado lo que el amigo @lulcar ha puesto para leer todas las imagenes:

Código Javascript:
Ver original
  1. var imageContainer = document.getElementById("slider_images");
  2.         var imageList = imageContainer.getElementsByTagName("img");

Cuando lo hago a mi manera es un enriedo porque entre los "childNodes" de ese contenedor hay tambien "text" y entonces hacer un filtro para las imagenes... que lio!!!!

2 .- He estado haciendo lios con los eventos ... a ver si me das una manita aqui
__________________
Salu2!
  #5 (permalink)  
Antiguo 27/05/2014, 19:05
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

La cosa se me pone un poco mas facil o mas complicada segun se quiera ver..

Me toca colocar en lugar de las imagenes, divs con contenido mixto (imagenes / texto)

hago el mismo recorrido pero tengo el mismo problema, los display se asignan como le da la regalada gana al script
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #6 (permalink)  
Antiguo 27/05/2014, 19:22
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Podrías juntar la imagen y el texto que le corresponda en un <div>, repitiendo la misma operación por cada imagen y texto que tengas, luego, en lugar de iterar sobre los elementos <img>, lo harías sobre los elementos <div> y para que sea más exclusivo, coloca la misma clase a todos los <div> y los tomas por dicho dato.

Código HTML:
Ver original
  1. <div class = "slider">
  2.     <img src = "imagen1.jpg" />
  3.     <label>Texto 1</label>
  4. </div>
  5.  
  6. <div class = "slider">
  7.     <img src = "imagen2.jpg" />
  8.     <label>Texto 2</label>
  9. </div>
  10.  
  11. <div class = "slider">
  12.     <img src = "imagen3.jpg" />
  13.     <label>Texto 3</label>
  14. </div>

Código Javascript:
Ver original
  1. var img = document.getElementsByClassName("slider"),
  2.     total = img.length,
  3.     i = 0,
  4.     fn = function(){
  5.         img[i].style.opacity = 0;
  6.         i = i == total - 1 ? 0 : ++i;
  7.         img[i].style.opacity = 1;        
  8.     };
  9.  
  10. img[i].style.opacity = 1;
  11. setInterval(fn, 4000);

No olvides aplicar estilos (CSS).

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 27/05/2014, 19:25
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Para ilustrarles mejor mi caso:

HTML:
Código HTML:
Ver original
  1. <div id="slider">
  2.   <div class="wrapper">
  3.     <div id="slider_images">
  4.       <div id="photo-1">
  5.         <img src="blabla" id="image-1" />
  6.         <h4>bla bla</h4>
  7.        </div>
  8.        <div id="photo-2">
  9.         <img src="blabla" id="image-2" />
  10.         <h4>bla bla</h4>
  11.        </div>
  12.        <div id="photo-3">
  13.         <img src="blabla" id="image-3" />
  14.         <h4>bla bla</h4>
  15.        </div>
  16.      </div>
  17.    </div>
  18. </div>

Código CSS:
Ver original
  1. div#slider {
  2.   width:100%;
  3.   background:rgb(46,46,46);
  4.   border-bottom:5px solid rgb(1,133,230);
  5. }
  6.  
  7.  
  8. div#slider div#slider_images {
  9.   height:270px;
  10.   overflow:hidden;
  11. }
  12.  
  13. div#slider div#slider_images div {
  14.   height:270px;
  15. }
  16.  
  17. div#slider div#slider_images div img {
  18.   width:100%;
  19. }
  20.  
  21. div#slider div#slider_images div h4 {
  22.   position:relative;
  23.   top:-8em;
  24.   background:#464646;
  25.   width:50%;
  26.   text-align:left;
  27.   margin-left:3em;
  28.   padding:15px 0 15px 30px;
  29. }
  30.  
  31. div#slider div#slider_images div h4 a {
  32.   color:#FFFFFF;
  33.   text-decoration:none;
  34. }
  35.  
  36. div#slider div#slider_images div h4 a:hover {
  37.   text-decoration:underline;
  38. }

Y el javascript
Código Javascript:
Ver original
  1. function rotateImages()
  2.       {
  3.         var imageContainer = document.getElementById("slider_images");
  4.         var imageList = imageContainer.getElementsByTagName("div");
  5.        
  6.         for (i = 0; i < imageList.length; i++){
  7.           if (!imageList[i].style.display){
  8.             imageList[i].style.display = "block";
  9.           }else{
  10.             if (imageList[i].style.display == "block"){
  11.               imageList[i].style.display = "none";              
  12.             }else{
  13.               imageList[i].style.display = "block";  
  14.             }
  15.             setTimeout(rotateImages,10000);
  16.           }
  17.         }
  18.       }

No tengo idea de como hacer que el javascript recorra en orden los divs y aparezcan en la misma secuencia
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #8 (permalink)  
Antiguo 27/05/2014, 19:31
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Solo por curiosidad, ¿revisaste el ejemplo en el enlace que te pasé?
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 27/05/2014, 19:50
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Cita:
Iniciado por Alexis88 Ver Mensaje
Solo por curiosidad, ¿revisaste el ejemplo en el enlace que te pasé?
Lo he visto pero por motivos de compatibilidad hacia atras, para versiones antiguas de firefox, chrome, safari, IE etc, me parece que getElementsByClassName no es una opción a tomar en cuenta.

Necesito que se haga por medio de los displays, porque asi se que todos los navegadores lo soportan y se puede adaptar mejor.
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #10 (permalink)  
Antiguo 27/05/2014, 20:00
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Bueno, solamente tendrías problemas con IE desde la versión 8 hacia atrás, porque IE 9 en adelante, Chrome, Firefox, Safari y Opera, no tienen problemas ni con getElementsByClassName ni con opacity. Podrías tomar a los elementos por su clase pero de otra forma:

Código Javascript:
Ver original
  1. var elementos = document.getElementsByTagName("*"),
  2.     total = elementos.length,
  3.     slider = [];
  4.  
  5. for (i = 0; i < total; i++)
  6.     if (elementos[i].className == "slider")
  7.         slider.push(elementos[i]);

Y para la compatibilidad con la propiedad opacity, IE soporta la propiedad filter.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 28/05/2014 a las 01:35 Razón: Fe de errata
  #11 (permalink)  
Antiguo 28/05/2014, 13:20
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Al final tuve que hacerlo a lo hardcode

Código Javascript:
Ver original
  1. function rotateImages()
  2.       {
  3.         var imageContainer = document.getElementById("slider_images");
  4.         var imageList = imageContainer.getElementsByTagName("div");
  5.        
  6.         if (!imageList[0].style.display){
  7.           imageList[0].style.display = "block";
  8.           imageList[1].style.display = "none";
  9.           imageList[2].style.display = "none";
  10.         }else{
  11.           if (imageList[0].style.display == "block" && imageList[1].style.display == "none"){
  12.             imageList[0].style.display = "none";
  13.             imageList[1].style.display = "block";
  14.             imageList[2].style.display = "none";
  15.           }else if(imageList[1].style.display == "block" && imageList[2].style.display == "none"){
  16.             imageList[0].style.display = "none";
  17.             imageList[1].style.display = "none";
  18.             imageList[2].style.display = "block";
  19.           }else if (imageList[2].style.display == "block" && imageList[0].style.display == "none"){
  20.             imageList[0].style.display = "block";
  21.             imageList[1].style.display = "none";
  22.             imageList[2].style.display = "none";
  23.           }
  24.         }
  25.         setTimeout(rotateImages,5000);
  26.       }

Dado que de momento el slider solo tendra 3 imagenes de manera continua, el codigo funciona, pero me gustaria saber si existe alguna posibilidad de adecuarlo para que trabaje de manera dinamica con 3, 4 o 5 imagenes de ser posible.
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #12 (permalink)  
Antiguo 28/05/2014, 13:38
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Cita:
Iniciado por Julcar Ver Mensaje
... me gustaria saber si existe alguna posibilidad de adecuarlo para que trabaje de manera dinamica con 3, 4 o 5 imagenes de ser posible.
tal cual eso es lo que hace el código de @alexis88 en la linea 6 i = i == total - 1 ? 0 : ++i;.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #13 (permalink)  
Antiguo 28/05/2014, 14:14
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Cita:
Iniciado por zerokilled Ver Mensaje
tal cual eso es lo que hace el código de @alexis88 en la linea 6 i = i == total - 1 ? 0 : ++i;.
Sorry xD yo vengo del mundillo ASP+VBScript y no se que significa

i = i == total - 1 ? 0 : ++i;

Algo lei que en C eso es un operador ternario, pero ni idea, alguien me lo puede explicar en español?
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"
  #14 (permalink)  
Antiguo 28/05/2014, 14:24
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Código Javascript:
Ver original
  1. i = i == total - 1 ? 0 : ++i;

equivale a

Código Javascript:
Ver original
  1. if (i == total - 1)
  2.       i = 0
  3. else
  4. ++i;

En PHP por ejemplo funciona exactamente igual

Código Pseudo:
Ver original
  1. (condicion a evaluar) ? (devuelve en caso de ser verdadero) : (devuelve en caso de ser falso)

Incluso en MS Excel existe pero es asi

Código Pseudo:
Ver original
  1. (condicion a evaluar , devuelve en caso de ser verdadero , devuelve en caso de ser falso)
__________________
Salu2!
  #15 (permalink)  
Antiguo 28/05/2014, 15:37
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Se llaman operadores ternarios y se usan en casi todos los lenguajes de programación. En cristiano, lo que está a la izquierda del signo de interrogación, es la condición, lo que está a la izquierda de los dos puntos es lo que se ejecuta cuando la condición se cumpla y lo que está a la derecha de los puntos, lo que se ejecuta cuando la condición no se cumpla.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #16 (permalink)  
Antiguo 28/05/2014, 17:14
Avatar de Julcar  
Fecha de Ingreso: noviembre-2007
Ubicación: C:\inetpub\wwwroot\Guayaquil
Mensajes: 1.507
Antigüedad: 16 años, 4 meses
Puntos: 54
Respuesta: Rotador de imagenes en Javascript se vuelve loco

Cita:
Iniciado por Alexis88 Ver Mensaje
Se llaman operadores ternarios y se usan en casi todos los lenguajes de programación. En cristiano, lo que está a la izquierda del signo de interrogación, es la condición, lo que está a la izquierda de los dos puntos es lo que se ejecuta cuando la condición se cumpla y lo que está a la derecha de los puntos, lo que se ejecuta cuando la condición no se cumpla.

Saludos
ah ya decia yo, en BASIC no tenemos esas cosas

Segun como me lo explicó @Italico76 se entiende mejor, ya que estoy acostumbrado al comun y corriente if(condicion){ejecucion}

Gracias por los consejos, de momento funciona, lo que me da tiempo para mejorar el script.
__________________
Linux no es el único S.O. libre, conoce a ReactOS el Windows Libre!
"Si mis respuestas te dan la calma, espárceme un poco de karma"

Etiquetas: imagenes, loco, rotador, vuelve
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 03:44.