Foros del Web » Programando para Internet » Javascript »

Rotación de banners

Estas en el tema de Rotación de banners en el foro de Javascript en Foros del Web. Hola a todos. he usado un script para rotar banner y va perfecto pero tengo un problema. Cambia de banner cada minuto y el banner ...
  #1 (permalink)  
Antiguo 23/09/2010, 03:20
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Rotación de banners

Hola a todos.

he usado un script para rotar banner y va perfecto pero tengo un problema. Cambia de banner cada minuto y el banner es aleatorio. Lo que yo necesito es que cambie cada minuto pero que solo la primera vez sea aleatorio. a partir del primer random, necesito que siga el orden de la lista.

He intentado modificar la variable "actual" pero no lo he conseguido...

Este es el script, muchas gracias de antemano:

var json = {
"rotator": {
"timer": "01",//Tiempo en minutos del intervalo de cambio
//Insertar tantas como imagenes iran en el banner
"images": [
{
"title": "Banner1",//Título del banner
"imageUrl": "_aux_images_banner/banner1.gif", //Url del banner
"url":"web1/",//Enlece al que irá al hacer click
"target":"_blank" //Destino del enlace del banner
},
{
"title": "Banner2",
"imageUrl": "_aux_images_banner/banner2.jpg",
"url": "web2",
"target":"_blank"
},
{
"title": "Banner3",
"imageUrl": "_aux_images_banner/banner3.gif",
"url": "web3",
"target":"_blank"
},
{
"title": "Banner4",
"imageUrl": "_aux_images_banner/banner4.gif",
"url": "web4",
"target":"_blank"
}
]
}
};

function print() {
var itemsRotator = eval(json);
var itemsCount = itemsRotator.rotator.images.length;
var prints = (itemsCount) - 0;
var actual = parseInt(Math.random() * prints);
//Contenedor de el rotador de banner
var container = document.getElementById('banner');

if (container) {
container.innerHTML = "<a target=\"_blank\" href=\""
+ itemsRotator.rotator.images[actual].url
+ "\"><img border=\"0\" alt=\""+itemsRotator.rotator.images[actual].title
+"\" title=\""+itemsRotator.rotator.images[actual].title
+"\" src=\""+itemsRotator.rotator.images[actual].imageUrl
+"\"/></a>";
}
}
function rotator() {
print();
var itemsRotator = eval(json);
setInterval("print()", itemsRotator.rotator.timer * 60000);
}
  #2 (permalink)  
Antiguo 23/09/2010, 07:22
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Rotación de banners

Pon la variable como global, así sólo será aleatorio una vez. Después en la función añades un if para ver si actual es menor que el length de las imágenes, si es igual lo igualas a 0, y al final de la función añades actual++.
Por cierto, no hace falta escapar las comillas (\") vale con usar ' (comillas simples). Y para el número aleatorio, en vez de usar parseInt() usa Math.round(), parseInt() convierte a entero, pero no tengo claro si lo hace al más próximo (o Math.round()), al inferior (o Math.floor()) o al superior (o Math.ceil()).
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #3 (permalink)  
Antiguo 24/09/2010, 05:44
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Rotación de banners

Buenas _cronos2.
gracias por la ayuda pero estoy un poco perdido en java script. ¿como se pone la variable en global?
¿sustituyo el if por el que me dices?
  #4 (permalink)  
Antiguo 27/09/2010, 09:42
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Rotación de banners

¿podrías guiarme un poquillo?
No he tocado apenas javascript...
Gracias.
  #5 (permalink)  
Antiguo 28/09/2010, 15:44
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Rotación de banners

Hola, acabo de ver el mensaje, lo siento. Por ejemplo:
Código Javascript:
Ver original
  1. //var json = eval(...)
  2. //donde los puntos suspensivos pon todo lo de las imágenes y eso
  3. var prints = json.rotator.images;
  4. var r = Math.round(Math.random()*prints.length);
  5. function print() {
  6.   r=r<prints.length?r:0;
  7.   var container = document.getElementById('banner');
  8.   if (container) {
  9.    container.innerHTML = "<a target='_blank' href='"
  10.    + prints[r].url
  11.    + "'><img border='0' alt='" + prints[r].title
  12.    +"' title='"+ prints[r].title
  13.    +"' src='"+ prints[r].imageUrl
  14.    +"' /></a>";
  15.    r++;
  16.   }
  17. }
  18. function rotator() {
  19.  setInterval("print()", json.rotator.timer*60000);
  20. }

Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 28/09/2010, 23:00
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 19 años, 10 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
  #7 (permalink)  
Antiguo 29/09/2010, 10:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Rotación de banners

Muchas gracias a los dos por la ayuda pero está claro que javascript no es lo mio

He copiado tu codigo en un js y no me funciona. ¿que hago mal? las dos variables, ¿hay que ponerlas? Sigo el codigo y lo entiendo pero no me funciona.

_cronos2, tu codigo tampoco me funciona


var json = {
rotator : {
timer : 01,
images : [{
title : "Banner1",
imageUrl: "_aux_images_banner/banner1.gif",
url : "http://www.terra.es",
target : "_blank"
},{
title : "Banner2",
imageUrl: "_aux_images_banner/banner2.jpg",
url : "http://www.terra.es",
target : "_blank"
},{
title : "Banner3",
imageUrl: "_aux_images_banner/banner3.gif",
url : "http://www.terra.es",
target : "_blank"
},{
title : "Banner4",
imageUrl: "_aux_images_banner/banner4.gif",
url : "http://www.terra.es",
target : "_blank"
}]
}
};

//forma de uso ;)
//var rotador1 = new Rotador("banner",json);
//var rotador2 = new Rotador("otroContenedor",json);
///////////////////////////////////////////////////////////////
/**
* Constructor de Rotador
* @param container: recibe el ID del contenedor donde se renderizará
* @param data: información de imágenes y configuraciones
*
**/
var Rotador = function(container,data){
this.container = document.getElementById(container);
this.data = data
this.prints = json.rotator.images;
this.timer = json.rotator.timer;
this.r = Math.round(Math.random()*this.prints.length);
}

Rotador.prototype = {
//imprime una imagen
print : function() {
this.r = this.r < this.prints.length?this.r:0;

if(this.container) {
var img = this.prints[this.r];
container.innerHTML = "<a target='_blank' href='"+ img.url+ "'>"
+ "<img border='0' alt='" + img.title + "' title='" + img.title + "' src='"+ img.imageUrl+ "' />"
+ "</a>";
}
this.r++;
},

//crea un intervalo que imprime las imagenes consecutivas
rotator : function() {
this.thread = setInterval(this.print, this.timer*6000); //no usen un string para ejecutar la función!!!
},

//inicia el proceso de pintado
start : function(){
this.print();
this.rotator();
}
}
  #8 (permalink)  
Antiguo 29/09/2010, 22:15
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 19 años, 10 meses
Puntos: 53
Respuesta: Rotación de banners

Ya ejecutaste el método "start"?? si no lo haces no pasará nada!! ;)


Código Javascript:
Ver original
  1. var rotador1 = new Rotador("banner",json);
  2. rotador1.start();



saludos
  #9 (permalink)  
Antiguo 04/10/2010, 02:30
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Rotación de banners

¿como se inicia?
yo he copiado todo el texto en un archivo js pero no carga ningún banner.
como ves no tengo mucha idea de js...
gracias de antemano.
  #10 (permalink)  
Antiguo 06/10/2010, 01:46
 
Fecha de Ingreso: septiembre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Rotación de banners

Ya le he hecho funcionar.
Muchisimas gracias por la ayuda.

Etiquetas: banner
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 10:03.