Ver Mensaje Individual
  #6 (permalink)  
Antiguo 28/09/2010, 23:00
Avatar de stock
stock
 
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 20 años, 4 meses
Puntos: 53
Respuesta: Rotación de banners

Hola Amigos, veo muchas malas prácticas en el código que muestran, el mal uso del namespace, el mal uso de la función setTimeout, mal uso del contexto, mal uso del scope, les ayudaré un poquito refactorizando el código inicial de la siguiente manera:


En algún archivo JS crear el prototipo Rotador
Código Javascript:
Ver original
  1. /**
  2.  *  Constructor de Rotador
  3.  *  @param container: recibe el ID del contenedor donde se renderizará
  4.  *  @param data: información de imágenes y configuraciones
  5.  *
  6.  **/
  7. var Rotador = function(container,data){
  8.     this.container = document.getElementById(container);
  9.     this.data = data
  10.     this.prints = json.rotator.images;
  11.     this.timer = json.rotator.timer;
  12.     this.r = Math.round(Math.random()*this.prints.length);
  13. }
  14.  
  15. Rotador.prototype = {
  16.     //imprime una imagen
  17.     print   : function() {
  18.         this.r = this.r < this.prints.length?this.r:0;
  19.  
  20.         if(this.container) {
  21.             var img = this.prints[this.r];
  22.             container.innerHTML = "<a target='_blank' href='"+ img.url+ "'>"
  23.                         + "<img border='0' alt='" + img.title + "' title='" + img.title + "' src='"+ img.imageUrl+ "' />"
  24.                         + "</a>";
  25.         }
  26.         this.r++;
  27.     },
  28.    
  29.     //crea un intervalo que imprime las imagenes consecutivas
  30.     rotator : function() {
  31.         this.thread = setInterval(this.print, this.timer*6000); //no usen un string para ejecutar la función!!!
  32.     },
  33.    
  34.     //inicia el proceso de pintado
  35.     start   : function(){
  36.         this.print();
  37.         this.rotator();
  38.     }
  39. }

Ahora, para usar el prototipo anterior, se hace de la siguiente manera:

Código Javascript:
Ver original
  1. //Este es un objeto listo para usarse, no es necesario
  2. //usar el "eval" para obtener la información
  3. var json = {
  4.     rotator : {
  5.         timer   : 01,   //Tiempo en minutos del intervalo de cambio
  6.         images  : [{    //Insertar tantas como imagenes iran en el banner
  7.             title   : "Banner1",    //Título del banner
  8.             imageUrl: "_aux_images_banner/banner1.gif", //Url del banner
  9.             url     : "web1/",  //Enlece al que irá al hacer click
  10.             target  : "_blank" //Destino del enlace del banner
  11.         },{
  12.             title   : "Banner2",
  13.             imageUrl: "_aux_images_banner/banner2.jpg",
  14.             url     : "web2",
  15.             target  : "_blank"
  16.         },{
  17.             title   : "Banner3",
  18.             imageUrl: "_aux_images_banner/banner3.gif",
  19.             url     : "web3",
  20.             target  : "_blank"
  21.         },{
  22.             title   : "Banner4",
  23.             imageUrl: "_aux_images_banner/banner4.gif",
  24.             url     : "web4",
  25.             target  : "_blank"
  26.         }]
  27.     }
  28. };
  29.  
  30. //forma de uso ;)
  31. var rotador1 = new Rotador("banner",json);
  32. var rotador2 = new Rotador("otroContenedor",json);

Si se han dado cuenta puedo crear instancias del objeto "Rotador" por lo tanto puedo poner varios rotadores en la página, el código es reutilizable, extendible, limpio y fácil de usar.

Si tienen alguna duda pueden dejar comentarios. Espero les sirva de ejemplo para escribir buen JavaScript.

Saludos