¿Cómo puedo ejecutar una devolución de llamada de JavaScript cuando se carga una imagen?

5 minutos de lectura

Quiero saber cuando una imagen ha terminado de cargarse. ¿Hay alguna manera de hacerlo con una devolución de llamada?

Si no, ¿hay alguna manera de hacerlo?

Ciro Santilli Avatar de usuario de OurBigBook.com
Ciro Santilli OurBigBook.com

.complete + devolución de llamada

Este es un método compatible con los estándares sin dependencias adicionales y no espera más de lo necesario:

var img = document.querySelector('img')

function loaded() {
  alert('loaded')
}

if (img.complete) {
  loaded()
} else {
  img.addEventListener('load', loaded)
  img.addEventListener('error', function() {
      alert('error')
  })
}

Fuente: http://www.html5rocks.com/en/tutorials/es6/promesas/

  • ¿Puede esto salir mal si la imagen se completa entre el img.complete llamar y el addEventListener ¿llamar?

    – Tomas Ahle

    09/01/2017 a las 18:40

  • @ThomasAhle No soy un experto, pero eso parece posible. A ver si alguien tiene una solución.

    – Ciro Santilli OurBigBook.com

    10/01/2017 a las 20:39

  • Supongo que solo sería un problema para el código paralelo, que la mayoría de JavaScript probablemente no lo sea.

    – Tomas Ahle

    10/01/2017 a las 21:20

  • @ThomasAhle No puede, porque el navegador solo activará el evento de carga cuando se gire la cola de eventos. Dicho esto, el load detector de eventos debe estar en un else cláusula, como img.complete puede hacerse realidad antes de que load evento se dispara, por lo tanto, si no fuera así, podría tener loaded llamado dos veces (tenga en cuenta que es relativamente probable que esto cambie de tal manera que img.complete solo se vuelve verdadero cuando se activa el evento).

    – gsnedders

    7 abr 2017 a las 16:06

  • Dónde está el load evento especificado? Parece que no lo encontré en MDN?

    usuario1663023

    3 de diciembre de 2022 a las 22:47

avatar de usuario de keparo
képaro

Imagen.onload() a menudo funcionará.

Para usarlo, deberá asegurarse de vincular el controlador de eventos antes de establecer el atributo src.

Enlaces relacionados:

Ejemplo de uso:

    window.onload = function () {

        var logo = document.getElementById('sologo');

        logo.onload = function () {
            alert ("The image has loaded!");		
        };

        setTimeout(function(){
            logo.src="https://edmullen.net/test/rc.jpg";         
        }, 5000);
    };
 <html>
    <head>
    <title>Image onload()</title>
    </head>
    <body>

    <img src="#" alt="This image is going to load" id="sologo"/>

    <script type="text/javascript">

    </script>
    </body>
    </html>

  • FYI: De acuerdo con la especificación W3C, onload no es un evento válido para los elementos IMG. Obviamente, los navegadores lo admiten, pero si le importan las especificaciones y no está 100% seguro de que todos los navegadores a los que desea apuntar lo admitan, es posible que desee repensarlo o al menos tenerlo en cuenta.

    – Jason Bunting

    12 de noviembre de 2008 a las 15:35

  • ¿Por qué esperar 5 segundos para configurar la fuente parece una mala idea?

    – quemeful

    21 de agosto de 2014 a las 11:42

  • @quemeful por eso se llama “un ejemplo”.

    – Diego Jancic

    5 de noviembre de 2015 a las 17:45

  • @JasonBunting ¿Qué estás mirando que te hace pensar que el load evento no es valido? html.spec.whatwg.org/multipage/webappapis.html#handler-onload es la definición de la onload controlador de eventos.

    – gsnedders

    7 abr 2017 a las 16:28

  • @gsnedders: se da cuenta, supongo, que cuando escribí ese comentario, me refería al estándar existente, no al que señaló, que es 4,5 años más nuevo. Si hubieras preguntado en ese entonces, podría haberlo señalado, tal vez. Tal es la naturaleza de la web, ¿verdad? Las cosas envejecen o se mueven o se modifican, etc.

    – Jason Bunting

    24 mayo 2017 a las 20:35


Avatar de usuario de Jon DellOro
Jon DellOro

Puede usar la propiedad .complete de la clase de imagen de Javascript.

Tengo una aplicación en la que almaceno una cantidad de objetos de imagen en una matriz, que se agregarán dinámicamente a la pantalla y, mientras se cargan, escribo actualizaciones en otro div en la página. Aquí hay un fragmento de código:

var gAllImages = [];

function makeThumbDivs(thumbnailsBegin, thumbnailsEnd)
{
    gAllImages = [];

    for (var i = thumbnailsBegin; i < thumbnailsEnd; i++) 
    {
        var theImage = new Image();
        theImage.src = "https://stackoverflow.com/questions/280049/thumbs/" + getFilename(globals.gAllPageGUIDs[i]);
        gAllImages.push(theImage);

        setTimeout('checkForAllImagesLoaded()', 5);
        window.status="Creating thumbnail "+(i+1)+" of " + thumbnailsEnd;

        // make a new div containing that image
        makeASingleThumbDiv(globals.gAllPageGUIDs[i]);
    }
}

function checkForAllImagesLoaded()
{
    for (var i = 0; i < gAllImages.length; i++) {
        if (!gAllImages[i].complete) {
            var percentage = i * 100.0 / (gAllImages.length);
            percentage = percentage.toFixed(0).toString() + ' %';

            userMessagesController.setMessage("loading... " + percentage);
            setTimeout('checkForAllImagesLoaded()', 20);
            return;
        }
    }

    userMessagesController.setMessage(globals.defaultTitle);
}

  • He usado un código similar en mi trabajo antes. Esto funciona bien en todos los navegadores.

    –Gabriel Hurley

    8 de agosto de 2009 a las 21:27

  • El problema con la verificación completa es que, a partir de IE9, los eventos OnLoad se activan antes de que se carguen todas las imágenes y ahora es difícil encontrar un disparador para la función de verificación.

    – Gen Vicente

    20 de marzo de 2013 a las 10:05

Avatar de usuario de Idan Beker
Idan Beker

La vida es demasiado corta para jquery.

function waitForImageToLoad(imageElement){
  return new Promise(resolve=>{imageElement.onload = resolve})
}

var myImage = document.getElementById('myImage');
var newImageSrc = "https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620"

myImage.src = newImageSrc;
waitForImageToLoad(myImage).then(()=>{
  // Image have loaded.
  console.log('Loaded lol')
});
<img id="myImage" src="">

Puede usar el evento load() en jQuery, pero no siempre se activará si la imagen se carga desde el caché del navegador. este complemento https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js puede usarse para remediar ese problema.

Avatar de usuario de Alexander Drobyshevsky
Alejandro Drobyshevsky

Aquí está el equivalente de jQuery:

var $img = $('img');

if ($img.length > 0 && !$img.get(0).complete) {
   $img.on('load', triggerAction);
}

function triggerAction() {
   alert('img has been loaded');
}

Avatar de usuario de Sajad
Sajad

Si el objetivo es diseñar el img después de que el navegador haya renderizado la imagen, debe:

const img = new Image();
img.src="https://stackoverflow.com/questions/280049/path/to/img.jpg";

img.decode().then(() => {
/* set styles */
/* add img to DOM */ 
});

porque el navegador primero loads the compressed version of imageentonces decodes itfinalmente paints él. ya que no hay evento para paint debe ejecutar su lógica después de que el navegador haya decoded la etiqueta img.

¿Ha sido útil esta solución?