2012-08-17 17 views
6

Mi objetivo es comprobar si la imagen se ha cargado correctamente. Ha funcionado bien en los navegadores modernos, pero IE8 o 7 es un problema terrible. Aquí hay un código de ejemplo:La carga de imagen no funciona con IE 8 o inferior

var img = new Image(), 
    url = 'http://something.com/images/something.gif'; 

    $(img).attr('src', url).load(function() { 
     if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) { 
      alert('broken image!'); 
     } 
     else { 
      alert('successfully loaded'); 
     } 
    } 

¿Alguien tiene alguna idea para solucionar este problema? Gracias en advace!

Respuesta

12

tiene que configurar el controlador de onload antes de establecer el valor .src.

En algunas versiones de IE, si la imagen está en el caché del navegador, el evento de carga se disparará inmediatamente cuando se establece el valor .src. Si su controlador de carga no está ya en su lugar, se perderá ese evento.

Además, naturalWidth y NO son compatibles con versiones anteriores de IE, por lo que siempre estarán indefinidos. Y debe usar onerror y onabort para detectar las condiciones de error.

No es necesario utilizar jQuery para esto. Usted simplemente puede hacer esto:

var img = new Image(), 

img.onload = function() { 
    alert("loaded successfully"); 
} 
img.onerror = img.onabort = function() { 
    alert("broken image"); 
} 
// only set .src AFTER event handlers are in place 
img.src = 'http://something.com/images/something.gif'; 
+0

En este caso, si la imagen ya está cargada, ¿volverá a cargarse o se cargará desde la memoria caché? – Sinal

+0

Si especifica la misma URL que se ha cargado previamente, el navegador la cargará desde la memoria caché. Ese es el punto del caché. – jfriend00

+0

Sí, ahora lo estoy trabajando en todos los navegadores. Muchas gracias :-) – Sinal

3

Si la imagen está rota, entonces el evento onload no se activará, en su lugar, se disparará el evento onerror. Así que hay que hacer como esto:

var img = new Image(), 
url = 'http://something.com/images/something.gif'; 

img.onload = function() { 
    alert('successfully loaded'); 
}; 

img.onerror = function() { 
    alert('broken image!'); 
}; 

$(img).attr('src', url); 

O con jQuery:

$(img).load(function() { 
    alert('successfully loaded'); 
}).error(function() { 
    alert('broken image!'); 
}).attr('src', url); 
+0

Gracias pero me pregunto por qué en Chrome y Firefox funcionan bien y me sale de alerta cuando la imagen se ha cargado correctamente. Digamos que si la imagen está bien, ¿tienes más sugerencias? – Sinal

+0

Bienvenido al mundo real de las inconsistencias del navegador. Hacer frente a ellos. – nalply

1
var url="http://something.com/images/something.gif", 
    img=new Image; 
img.onload=img.onerror=function(ev){ 
    if(ev.type=="load")alert("successfully loaded"); 
    else if(ev.type=="error")alert("error loading"); 
} 
img.src=url; 
// If image is cached then no `onload` or `onerror` can occur. 
if(img.complete){ 
    alert("successfully loaded"); 
    img.onload=img.onerror=null; 
}