image.onload evento y caché del navegador


112

Quiero crear un cuadro de alerta después de que se cargue una imagen, pero si la imagen se guarda en la caché del navegador, el .onloadevento no se activará.

¿Cómo puedo activar una alerta cuando se ha cargado una imagen independientemente de si la imagen se ha almacenado en caché o no?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

6
posible duplicado de la devolución de llamada
Fabrício Matté

Respuestas:


152

A medida que genera la imagen de forma dinámica, establezca la onloadpropiedad antes de src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle : probado en las últimas versiones de Firefox y Chrome.

También puede usar la respuesta en esta publicación , que adapté para una sola imagen generada dinámicamente:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Violín


Espere. ¿Por qué su segundo ejemplo de código hace algo incorrecto y se configura .srcantes de configurar .onload? Lo hizo bien en el primer ejemplo de código, pero arruinó el segundo. El segundo no funcionará correctamente en algunas versiones de IE.
jfriend00

1
@ jfriend00 No, no es un desastre. El código de respaldo (segundo) es exactamente para en caso de que el primero deje de funcionar de alguna manera. =]Utiliza una .completeverificación en caso de que la imagen ya estuviera en caché, por lo que el código lo estaba demostrando. Por supuesto, para la mejor práctica, siempre puede establecer el srcenlace de controladores después de todo.
Fabrício Matté

4
Simplemente NO hay razón para confiar .completeen este caso. Simplemente configure su manipulador de carga primero antes de configurarlo .srcy NUNCA es necesario. He escrito una presentación de diapositivas que utilizan miles de sitios en todos los navegadores imaginables y la primera técnica funciona siempre. No hay necesidad de verificar .completecuando se crea una nueva imagen desde cero como esta.
jfriend00

Muy bien, gracias por el aviso, actualizó la respuesta para reflejar su razonamiento =]. También @ jfriend00, ¿podrías comprobar si la imagen se carga en IE? Me pregunto si es un problema con mi red o con IE y la imagen.
Fabrício Matté

9
También hoy descubrí que webkit necesita img.src = ''antes de asignar un nuevo src si se usó antes.
quux

10

Si el src ya está configurado, entonces el evento se activa en el caso almacenado en caché incluso antes de que consigas el controlador de eventos vinculado. Por lo tanto, también debe activar el evento basado en .complete.

muestra de código:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

Hay dos posibles soluciones para este tipo de situaciones:

  1. Utilice la solución sugerida en esta publicación
  2. Agregue un sufijo único a la imagen srcpara obligar al navegador a descargarla nuevamente, así:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

En este código, cada vez que agregas la marca de tiempo actual al final de la URL de la imagen, la haces única y el navegador descargará la imagen nuevamente.


44
Todo lo que esto hace es derrotar el almacenamiento en caché. Es la forma INCORRECTA de resolver este problema. La forma correcta está en la respuesta de Fabricio. Simplemente configure el .onloadcontrolador antes de configurar el .srcvalor y no se perderá el evento onload en algunas versiones de IE.
jfriend00

1
sí, tiene razón, pero no siempre es deseable almacenar en caché, a veces las imágenes no deben almacenarse en caché. por supuesto, en esta situación particular, depende de las necesidades
haynar

1
En mi aplicación angular probé todo lo que dicen otras respuestas, pero no ayudó. Pero forzar no almacenar en caché como dice esta respuesta funcionó para mí. Así que más uno de mí.
Thanu

La única solución que funcionó para mí en la última versión de Chrome.
Young Bob

3

Hoy me he encontrado con el mismo problema. Después de probar varios métodos, me doy cuenta de que simplemente poner el código de tamaño dentro en $(window).load(function() {})lugar de document.readyresolvería parte del problema (si no está agregando la página).


Esta también es una buena respuesta para la situación en la que el navegador tiene una imagen en caché, funciona bien con la carga de la ventana
Shocker

exactamente el problema al que me enfrentaba. cambiando $(document).readypara $(window).loadresolver mi problema.
Tariqul Islam

0

Descubrí que puedes hacer esto en Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

Establecer el .src a sí mismo activará el evento onload.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.