Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

156
Vistas
Simulación de tirada de troquel JS con 6 imágenes de troquel

en Js, quiero intentar simular una tirada de dados mostrando imágenes de los dados 1 a 6, pero cuando trato de mostrarlas en un bucle for, solo muestra la imagen dado6. Intenté poner un bucle for anidado para ralentizar el bucle exterior, pero eso no funcionó. ¿La página necesita actualizarse después de cambiar el atributo "src"?

 const dieImage = function (num) { return "images/dice" + String(num).trim() + ".png"; }; function dieRoll(num) { for (let i = 1; i < 7; i++) { for (let z = 0; z < 44444; z++) {} // attempt to slow if (num === 1) { img1.setAttribute("src", dieImage(i)); } else { img2.setAttribute("src", dieImage(i)); } } }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Lo que te falta (más o menos) es que el navegador pinta la pantalla cuando el código JavaScript ha terminado de ejecutarse. Aunque esté configurando el atributo src en una imagen diferente en un bucle, el código JavaScript finaliza solo cuando finaliza el bucle. El navegador pinta solo una vez, es decir, la última imagen que configuró en el ciclo. Esta explicación puede ser demasiado simplificada, pero te da una idea.

La solución es volver desde el código JavaScript después de configurar el src y repetirlo después de un retraso adecuado, dando al usuario la oportunidad de sentir el cambio. setTimeout probablemente sea lo suficientemente bueno para su caso; en otros casos de uso en los que desea una animación realmente fluida, habría otras soluciones (por ejemplo requestAnimationFrame() ). Una implementación no probada para demostrar la intención:

 function dieRoll(selectedNum) { var counter = 8; // how many times to change the die function repeat() { if (counter === 1) { // on the last iteration, set the image representing the selected number img1.setAttribute("src", dieImage(selectedNum)); } else { // else decrement the counter, set a random image and repeat after a timeout counter--; img1.setAttribute("src", dieImage(Math.floor(6 * Math.random()) + 1)); setTimeout(repeat, 300); } } repeat(); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Como se menciona en los comentarios, puede usar setTimeout . Puede introducir un retraso y darle al navegador la oportunidad de volver a dibujar usando setTimeout , promise y await , por ejemplo, así:

 const DELAY = 300; // 300ms async function dieRoll(num) { for (let i = 1; i < 7; i++) { if (num === 1) { img1.setAttribute("src", dieImage(i)); } else { img2.setAttribute("src", dieImage(i)); } await new Promise((resolve) => setTimeout(() => resolve(), DELAY)); } }

La ejecución del bucle se detendrá hasta que se resuelva la promesa, pero permitirá que el navegador continúe respondiendo y redibujando. Cuando la promesa se resuelve después de que se ejecuta la devolución de llamada de tiempo de espera después de los milisegundos DELAY dados, tendrá lugar la siguiente iteración del bucle.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda