Foros del Web » Programando para Internet » Javascript »

Imagen aleatoria en un inicio

Estas en el tema de Imagen aleatoria en un inicio en el foro de Javascript en Foros del Web. Hola a todos, me gustaría pedirles ayuda con un script que tengo, verán, el script lo que hace es alternar imágenes en un div en ...
  #1 (permalink)  
Antiguo 06/10/2012, 16:22
 
Fecha de Ingreso: noviembre-2011
Mensajes: 108
Antigüedad: 13 años, 1 mes
Puntos: 5
De acuerdo Imagen aleatoria en un inicio

Hola a todos, me gustaría pedirles ayuda con un script que tengo, verán, el script lo que hace es alternar imágenes en un div en forma aleatoria con su correspondiente enlace guardado en un array, con la ayuda del setinterval realiza el cambio cada 5 segundos, pero, el problema, es que al inicio de cargar la página se demora 5 segundos en aparecer la primera imagen, luego funciona sin ningún problema, alguien tiene alguna sugerencia o modificación para que el script me muestre una imagen aleatoria al momento de cargar la página por primera vez y luego siga operando normalmente?


<SCRIPT LANGUAGE="JavaScript">

banners = new Array();
banners[0]= new Array("1156.png","http://www.enlace1.com");
banners[1]= new Array("1441.png","http://www.enlace2.com");
banners[2]= new Array("2192.png","http://www.enlace3.com");

function cambiarImagen()
{
var ad = parseInt(Math.random() * banners.length);
seleccionado= banners[ad][0];
enlace= banners[ad][1];
document.getElementById('img').src= banners[ad][0];
document.getElementById('link').href= banners[ad][1];
}
setInterval(cambiarImagen,3000)
</SCRIPT>

<a href="" id="link" target="_blank">
<img src="" id="img" width="770" height="330" border="0">
</a>
__________________
Jlx4
  #2 (permalink)  
Antiguo 06/10/2012, 18:30
Avatar de Sirikon  
Fecha de Ingreso: marzo-2009
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 11
Respuesta: Imagen aleatoria en un inicio

por lo que veo haces la función, y luego haces un setInterval a esa función ya definida.

Creo que bastaría con añadir un onload al body, algo así...

Código HTML:
Ver original
  1. <body onload="cambiarImagen();">
  2. ...tu pagina web...
  3. </body>
  #3 (permalink)  
Antiguo 06/10/2012, 18:54
 
Fecha de Ingreso: noviembre-2011
Mensajes: 108
Antigüedad: 13 años, 1 mes
Puntos: 5
Respuesta: Imagen aleatoria en un inicio

No funciona, me imagino que es lo mismo porque estamos diciendo que al recargar la página se ejecute la función, y como tiene un setinterval se ejecutará cada 5 segundos, he estado pensando que quizás deba hacer una función aparte con el mismo array, pero que se ejecute sólo al recargar la página y nada más, y luego continúe la otra función, pero si pudiera juntar todo en una sola función sería más práctico xD
__________________
Jlx4
  #4 (permalink)  
Antiguo 06/10/2012, 20:17
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Imagen aleatoria en un inicio

El sistema que estás usando requiere una imagen y un link x defecto, posteriormete la función modificará los atributos src y href, es decir, tenés que usar

Código HTML:
Ver original
  1. <a href="link x defecto" id="link" target="_blank">
  2.  <img src="imagen x defecto" id="img" width="770" height="330" border="0">
  3.  </a>

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 06/10/2012, 21:12
 
Fecha de Ingreso: noviembre-2011
Mensajes: 108
Antigüedad: 13 años, 1 mes
Puntos: 5
Respuesta: Imagen aleatoria en un inicio

Funciona, sin embargo, de esta manera la imagen y link del comienzo están fijos y siempre serán lo mismo, y justo lo que necesito, es que la imagen del comienzo sea al azar igual que las que siguen.
__________________
Jlx4
  #6 (permalink)  
Antiguo 07/10/2012, 07:24
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Respuesta: Imagen aleatoria en un inicio

jlx4, el código entre etiquetas de código, por favor.

Las respuestas que te dieron hasta ahora están muy bien. Si el escript tal como está (que es tal como te dice emprear) no te sirve porque no inicia con un banner al azar, entonces hay que adaptarlo.

Y la mejor forma sería la propuesta por Sirikon, aunque me queda una duda sobre esa función : en principio,
qué la dispara?.

Deberías poner un ejemplo que podamos probar, así no nos hacés perder el tiempo con mil preguntas que llenan un post inutilmente, y que al final son para ayudarte a vos.
  #7 (permalink)  
Antiguo 07/10/2012, 08:58
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Imagen aleatoria en un inicio

ejecutá la función tambien onload, con lo que la imagen debiera cambiarse.
Edito:
Despiste el mío. Es lo que sugirió @Sirikon +1


Otra cosa a tener en cuenta, si hacés un ramdom y tenés solo 3 imágenes, es probable que veas varias veces la misma antes de que se produzca la rotación.

Te dejo una función para que analices, con lo que se hace el ramdom pero los numeros no se repiten

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <script type="text/javascript">
  8. //<![CDATA[
  9. //Método Fisher-Yates
  10. var mezclar = function(n){
  11. for(var j, x, i = n.length; i; j = parseInt(Math.random() * i), x = n[--i], n[i] = n[j], n[j] = x);
  12.  
  13. return n;
  14. }
  15. var sec = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  16. function mostrar(){
  17. var texto = document.getElementById('texto');
  18. var cadena = mezclar(sec).toString();
  19. if(sec.length == 1){
  20. sec = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  21. }
  22. texto.innerHTML = cadena[0];
  23. sec.shift();
  24. }
  25.  
  26. setInterval("mostrar()", 1000);
  27.  
  28. //]]>
  29. </head>
  30. <body onload="mostrar();">
  31. <span id="texto">
  32. </span>
  33. </body>
  34. </html>

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Última edición por emprear; 07/10/2012 a las 10:09
  #8 (permalink)  
Antiguo 07/10/2012, 13:57
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Imagen aleatoria en un inicio

Cita:
var mezclar = function(n){
for(var j, x, i = n.length; i; j = parseInt(Math.random() * i), x = n[--i], n[i] = n[j], n[j] = x);

return n;
}
emprear, a ver si estoy equivocada en mi lógica. Math.random redondea al entero mas próximo. ahora supongamos que devuelve .99 y lo multiplicamos por el número de elementos que tiene el array (10), el resultado sería 9.9 y redondea al entero mas próximo (10). pero esa posición no existe en el array. para evitar este posible error
Cita:
Math.floor(Math.random() * largo_array)
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #9 (permalink)  
Antiguo 07/10/2012, 14:23
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Respuesta: Imagen aleatoria en un inicio

Pero el Math.random() sólo crea un número pseudoaleatorio positivo desde cero y menor que uno. En su ejemplo parseInt() le quita el .9 y deja el entero, que es 9.


De todas formas, yo tampoco entiendo bien cómo funciona.
  #10 (permalink)  
Antiguo 07/10/2012, 14:28
 
Fecha de Ingreso: noviembre-2011
Mensajes: 108
Antigüedad: 13 años, 1 mes
Puntos: 5
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por furoya Ver Mensaje
jlx4, el código entre etiquetas de código, por favor.

Las respuestas que te dieron hasta ahora están muy bien. Si el escript tal como está (que es tal como te dice emprear) no te sirve porque no inicia con un banner al azar, entonces hay que adaptarlo.

Y la mejor forma sería la propuesta por Sirikon, aunque me queda una duda sobre esa función : en principio,
qué la dispara?.

Deberías poner un ejemplo que podamos probar, así no nos hacés perder el tiempo con mil preguntas que llenan un post inutilmente, y que al final son para ayudarte a vos.

furoya disculpa por las etiquetas de código, no había podido responder con anterioridad, pero, sé que hay que adaptar el script, pero al no ser un gran experto no he logrado dar con la respuesta, de hecho, me he matado pensando en una posible solución, ahora, sé que las respuestas están buenas, la de Sirikon y la de emprear funcionan, pero por sí solas no funcionaban, al combinar ambas si funcionó, se carga una imagen al azar al inicio y después cada 5 segundos, el único problema es que en los navegadores Iexplorer y Firefox se aparece velozmente la imagen por defecto y luego se cambia a una aleatoria, posteriormente continúa normal al cabo de los 5 segundos. En cuanto al disparador la verdad sólo funciona con el setinterval y el valor aleatorio, nada más. El script así como está funciona, la única diferencia sería que el link e imagen aleatorias las tengo dentro de un div.




Cita:
Iniciado por emprear Ver Mensaje
ejecutá la función tambien onload, con lo que la imagen debiera cambiarse.
Edito:
Despiste el mío. Es lo que sugirió @Sirikon +1


Otra cosa a tener en cuenta, si hacés un ramdom y tenés solo 3 imágenes, es probable que veas varias veces la misma antes de que se produzca la rotación.

Te dejo una función para que analices, con lo que se hace el ramdom pero los numeros no se repiten

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <script type="text/javascript">
  8. //<![CDATA[
  9. //Método Fisher-Yates
  10. var mezclar = function(n){
  11. for(var j, x, i = n.length; i; j = parseInt(Math.random() * i), x = n[--i], n[i] = n[j], n[j] = x);
  12.  
  13. return n;
  14. }
  15. var sec = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  16. function mostrar(){
  17. var texto = document.getElementById('texto');
  18. var cadena = mezclar(sec).toString();
  19. if(sec.length == 1){
  20. sec = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  21. }
  22. texto.innerHTML = cadena[0];
  23. sec.shift();
  24. }
  25.  
  26. setInterval("mostrar()", 1000);
  27.  
  28. //]]>
  29. </head>
  30. <body onload="mostrar();">
  31. <span id="texto">
  32. </span>
  33. </body>
  34. </html>

Saludos


Gracias por la función, la voy a analizar, como dato, he probado también agregándole más imágenes, actualmente tengo 5 imágenes en el array con sus respectivos enlaces, el procedimiento es el mismo, eso podría decir, gracias nuevamente.
__________________
Jlx4
  #11 (permalink)  
Antiguo 07/10/2012, 15:04
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por IsaBelM Ver Mensaje
emprear, a ver si estoy equivocada en mi lógica. Math.random redondea al entero mas próximo. ahora supongamos que devuelve .99 y lo multiplicamos por el número de elementos que tiene el array (10), el resultado sería 9.9 y redondea al entero mas próximo (10). pero esa posición no existe en el array. para evitar este posible error
En realidad es una buena observación, ya que el método original usa Math.floor, convengamos que la función es mérito de los señores Fisher y Yates, a los que , como no recuerdo quien, imaginó como
Cita:
Dos señores con sus gafas de culo de vaso y su barbita rubia llenando de garabatos una enorme pizarra en alguna universidad del medio oeste.
Yo usé parseInt() porque el fragmento viene de otra script en la que si mal no recuerdo, estaba testeando que era más rápido.

Tampoco es cierto, me rompí mucho la cabeza para ver como funcionaba

De todas formas en este caso en particular va a funcionar igual porque trabajamos sobre un valor conocido que siempre nos devolverá un entero, pongo la script completa con lo de las imágenes

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <script type="text/javascript">
  8. //<![CDATA[
  9. //Método Fisher-Yates modificado
  10.  
  11. var mezclar = function(n){
  12. for(var j, x, i = n.length; i; j = Math.floor(Math.random() * i), x = n[--i], n[i] = n[j], n[j] = x);
  13.  
  14. return n;
  15. }
  16. var sec = [0,1,2,3,4,5,6,7];
  17. function mostrar(){
  18. var banners = new Array();
  19. banners[0]= new Array("google.jpg","http://www.enlace1.com","Google");
  20. banners[1]= new Array("foros.jpg","http://www.enlace2.com","FDW");
  21. banners[2]= new Array("body-bottom.png","http://www.enlace3.com","");
  22. banners[3]= new Array("354.gif","http://www.enlace1.com","Google");
  23. banners[4]= new Array("378.gif","http://www.enlace2.com","FDW");
  24. banners[5]= new Array("417.gif","http://www.enlace3.com","");
  25. banners[6]= new Array("469.gif","http://www.enlace1.com","Google");
  26. banners[7]= new Array("481.png","http://www.enlace3.com","");
  27.  
  28. var texto = document.getElementById('texto');
  29. var cadena = mezclar(sec);
  30. if(sec.length == 1){
  31. sec = [0,1,2,3,4,5,6,7];
  32. }
  33.  
  34. var num = cadena[0];
  35. texto.innerHTML = cadena[0];
  36. document.getElementById('img').src= banners[num][0];
  37. document.getElementById('link').href= banners[num][1];
  38. document.getElementById('img').title= banners[num][2];
  39. sec.shift();
  40. }
  41.  
  42. setInterval("mostrar()", 3000);
  43.  
  44. //]]>
  45. </head>
  46. <body onload="mostrar();">
  47. <span id="texto">
  48. </span>
  49. <br />
  50. <a href="http://google.com" id="link" target="_blank" name="link">
  51.     <img src="google.jpg" id="img" width="770" height="330" border="0" alt="Google" name="img" title="Google"/></a>
  52. </body>
  53. </html>



Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #12 (permalink)  
Antiguo 07/10/2012, 15:42
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por furoya Ver Mensaje
Pero el Math.random() sólo crea un número pseudoaleatorio positivo desde cero y menor que uno. En su ejemplo parseInt() le quita el .9 y deja el entero, que es 9.


De todas formas, yo tampoco entiendo bien cómo funciona.
es entre 0 y 1

emprear, parte de lo que dije anteriormente era erróneo. lo equivoqué con Math.round().

como tenemos que redondear el número generado, la manera de no obtener un entero que este fuera de rango es con Math.floor(). con parseInt se corre ese riesgo, al igual que con Marth.round()
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Última edición por IsaBelM; 16/10/2012 a las 05:17
  #13 (permalink)  
Antiguo 08/10/2012, 13:52
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Imagen aleatoria en un inicio

con 3, 5 ó 20 imágenes, tarde mas o tarde menos se producirá una repetición aquí detallo el problema
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #14 (permalink)  
Antiguo 08/10/2012, 15:14
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por IsaBelM Ver Mensaje
con 3, 5 ó 20 imágenes, tarde mas o tarde menos se producirá una repetición aquí detallo el problema
Si, es cierto, la idea de lo que puse era que ese conjunto de 8 imágenes originales no se repitiese hasta completar el ciclo, bien puede darse que la ultima imágen de la primera pasada fuesa la primera de la siguiente con lo que se produciría esa suma de tiempos excesivos.
Voy a analizar tu aporte luego, con más tiempo, aunque a primera vista parece más que prometedor.

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #15 (permalink)  
Antiguo 08/10/2012, 16:01
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 11 meses
Puntos: 206
Respuesta: Imagen aleatoria en un inicio

Modificando ligeramente el algoritmo que puse aquí, puedes conseguir lo que pides:
http://www.forosdelweb.com/f13/rando...epetir-997287/

Mezclas el array, y lo vas recorriendo de 0 hasta su length-1 en cada tick del timeout. Cuando llegues a la última posición, vuelves a mezclar el array y vuelta a empezar.
  #16 (permalink)  
Antiguo 21/10/2012, 08:21
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por IsaBelM Ver Mensaje
Nooop. El sitio está equivocado. Es entre 0 y "casi" 1. Con suerte, llegaría al 0.9 periódico (¿cómo se marca el período con unicode?), y entonces podríamos discutir si en el efecto práctico es '1'. Pero no creo que llegue, ni por azar.

Estoy seguro que el valor pseudoaleatotio lo saca del clock, pero nunca me puse a averiguar cómo lo calcula.

Conviene saberlo, para entender por qué el JS no da reales posibilidades (matemáticas) de hacer cálculos estadísticos de azar.
  #17 (permalink)  
Antiguo 21/10/2012, 08:50
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por furoya Ver Mensaje
cómo se marca el período con unicode
Me parece que no existe, porque el arco puede varíar según la cantidad de cifras que contenga el período, generalmente usan los 3 puntos (...)

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #18 (permalink)  
Antiguo 22/10/2012, 04:25
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Imagen aleatoria en un inicio

Cita:
Iniciado por furoya Ver Mensaje
Nooop. El sitio está equivocado. Es entre 0 y "casi" 1. Con suerte, llegaría al 0.9 periódico

es lo que sabía/pensaba, pero por cosas de vagabundeo llegué a ese articulo y pensé - tengo que editarlo - y ahora al consultar la biblia mdn, tendría que editarlo otra vez, pero ya quedaría raro
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Etiquetas: aleatoria, enlace, imagenes, setinterval
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:42.