2010-07-25 23 views
21

Estoy cargando una ruta de imagen a través de jQuery $ .ajax y antes de mostrar la imagen me gustaría comprobar si de hecho existe. ¿Puedo usar el evento de carga de imagen/listo o algo similar para determinar que la ruta del archivo es válida?jQuery: compruebe si existe imagen

Tras haber expuesto a .myimage display: none, estoy esperando para hacer algo como

$(".myimage").attr("src", imagePath); 
$(".myimage").load(function() { 
    $(this).show(); 
}); 

¿Es posible algo así?

+0

Esto podría ayudar http://www.ambitionlab.com/how-to-check-if-a-file- exists-using-jquery-2010-01-06 – Hari

Respuesta

33

Bueno, puede enlazar .error() manejador ...

como este,

$(".myimage").error(function(){ 
    $(this).hide(); 
}); 

así, el suyo es bien ya con load-event

$(".myimage").load(function() { 
    $(this).show(); 
}); 

el problema con esto es que si Javascript se deshabilitó la imagen nunca se mostrará ...

+0

¿De verdad? No creía que el método de carga se pudiera usar, solo lo publiqué como un ejemplo de lo que intento hacer. Además, no me preocupa que Javascript esté deshabilitado, ya que estoy usando $ .ajax para comenzar ... :) +1 – Marko

+0

explica por qué el voto negativo. Para que esta respuesta pueda mejorarse si tiene algo ... – Reigel

+0

Parece que esto solo funciona intermitentemente en Internet Explorer 9. (No he probado las otras versiones, por ejemplo). Estoy usando varias funciones $ (documento) .ready, pero parece funcionar sin problemas en los otros navegadores y no se producen errores. Puede verlo aquí: si una cubierta no existe en el servidor, significa que se ha eliminado y luego muestra la información de la cubierta eliminada. http://fordummiescovers.com/share.php?id=100 Funcionalidad JS: http://fordummiescovers.com/js/covercheck.js – BWelfel

4

Como ya está haciendo una solicitud de AJAX, la descargo a la aplicación del lado del servidor que admite su AJAX. Es trivial verificar si existe un archivo desde el servidor, y puede establecer variables en los datos que envía para especificar resultados.

+1

+1 Buen pensamiento. –

+1

-1 el '.load()' que OP usa no es un ajax ... http://api.jquery.com/load-event/ – Reigel

+0

Esa es una respuesta decente y una posible alternativa, pero mi pregunta es si puedo verificar con jQuery específicamente ... +1 para el método del servidor. – Marko

6

Un ol d hilo que sé, pero creo que podría mejorarse. Noté que OP tenía problemas intermitentes que podrían deberse a la carga de la imagen y a la comprobación de errores simultáneamente. Sería mejor dejar que la carga de la imagen primero y luego comprobar si hay errores:

$(".myimage").attr("src", imagePath).error(function() { 
    // do something 
}); 
20

Probar:

function urlExists(testUrl) { 
var http = jQuery.ajax({ 
    type:"HEAD", 
    url: testUrl, 
    async: false 
    }) 
    return http.status; 
     // this will return 200 on success, and 0 or negative value on error 
} 

a continuación, utilizar

if(urlExists('urlToImgOrAnything') == 200) { 
    // success 
} 
else { 
    // error 
} 
+0

Esto da como resultado la siguiente advertencia: "XMLHttpRequest sincrónico en el hilo principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final ". –

2

Esta pregunta se hace un par de años, pero aquí hay un mejor ejemplo de uso para el controlador de errores para cualquiera que mire esto.

$("img") 
    .error(function(){ 
    $(this).hide(); 
    }) 
    .attr("src", "image.png"); 

Debe conectar el controlador de errores antes de intentar cargar la imagen para detectar el evento.

Fuente: http://api.jquery.com/error/

0

Esto es lo que hice mío:

$.get('url/image', function(res){ 
    //Sometimes has a redirect to not found url 
    //Or just detect first the content result and get the a keyword for 'indexof' 
    if (res.indexOf('DOCTYPE') !== -1) { 
     //not exists 
    } else { 
     //exists 
    } 
});