javascript - new - evento image.onload y caché del navegador
javascript new image onload (5)
Quiero crear un cuadro de alerta después de cargar una imagen, pero si la imagen se guarda en el caché del navegador, el evento .onload
no se disparará.
¿Cómo disparo una alerta cuando una imagen se ha cargado independientemente de si la imagen ha sido almacenada en caché o no?
var img = new Image();
img.src = "img.jpg";
img.onload = function () {
alert("image is loaded");
}
Como está generando la imagen dinámicamente, establezca la propiedad onload
antes del 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 post , que he adaptado para una única imagen generada dinámicamente:
var img = new Image();
// ''load'' event
$(img).on(''load'', function() {
alert("image is loaded");
});
img.src = "img.jpg";
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;
});
Configurar el .src a sí mismo activará el evento de carga.
Hay dos posibles soluciones para este tipo de situaciones:
- Usa la solución sugerida en post
Agregue un sufijo único a la imagen
src
para obligar al navegador a descargarlo de nuevo, 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 agrega la marca de tiempo actual al final de la URL de la imagen, la hace única y el navegador descargará la imagen nuevamente.
He encontrado el mismo problema hoy. Después de probar varios métodos, me doy cuenta de que simplemente coloque el código de tamaño dentro de $(window).load(function() {})
lugar de document.ready
resolvería parte del problema (si no está abriendo la página).
Si el src ya está configurado, el evento se activará en el caso en caché incluso antes de que consiga enlazar el manejador de eventos. Por lo tanto, debe desencadenar el evento basado en .complete
también.
muestra de código:
$("img").one("load", function() {
//do stuff
}).each(function() {
if(this.complete || /*for IE 10-*/ $(this).height() > 0)
$(this).load();
});