2010-07-25 43 views
21

Sto caricando un percorso immagine tramite jQuery $ .ajax e prima di mostrare l'immagine mi piacerebbe controllare se esiste effettivamente. Posso utilizzare l'evento caricamento immagine/pronto o qualcosa di simile per determinare se il percorso del file è valido?jQuery: Verifica se l'immagine esiste

Avendo .myimage impostato su display: none, spero di fare qualcosa di simile

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

è qualcosa di simile possibile?

+0

Questo potrebbe aiutare http://www.ambitionlab.com/how-to-check-if-a-file- exists-using-jquery-2010-01-06 – Hari

risposta

33

Beh, è ​​possibile associare .error() handler ...

come questo,

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

bene, il vostro va bene già con load-event

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

il problema con questo è se Javascript era disabilitato l'immagine non verrà mai mostrata ...

+0

Oh davvero? Non pensavo che il metodo di caricamento potesse essere usato, l'ho appena postato come esempio di quello che sto cercando di fare. Inoltre non sono preoccupato che Javascript sia disabilitato poiché sto usando $ .ajax per iniziare .. :) +1 – Marko

+0

per favore spiega perché il down-vote. In modo che questa risposta possa essere migliorata se si dispone di qualcosa ... – Reigel

+0

Sembra funzionare solo a intermittenza in Internet Explorer 9. (Non ho testato le altre versioni ie). Sto usando più funzioni $ (documento) .ready ma sembra funzionare senza intoppi negli altri browser e non vengono lanciati errori. Puoi vederlo qui - se una cover non esiste sul server, significa che è stata rimossa e mostrare le informazioni rimosse dalla copertina. http://fordummiescovers.com/share.php?id=100 Funzionalità JS: http://fordummiescovers.com/js/covercheck.js – BWelfel

4

Dato che si sta già facendo una richiesta AJAX, lo scaricherò sull'app lato server che supporta AJAX. È banale controllare se esiste un file dal server e si possono impostare variabili nei dati che si inviano per specificare i risultati.

+1

+1 Buona idea. –

+1

-1 il '.load()' che l'OP sta usando non è un ajax .... http://api.jquery.com/load-event/ – Reigel

+0

Questa è una risposta decente e una possibile alternativa, ma la mia domanda è se posso verificare con jQuery in particolare .. +1 per il metodo server però. – Marko

6

An ol d filo so ma penso che potrebbe essere migliorato. Ho notato che OP ha problemi intermittenti che potrebbero essere dovuti al caricamento dell'immagine e al controllo degli errori simultaneamente. Sarebbe meglio lasciare prima il carico di immagini e quindi verificare la presenza di errori:

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

Prova:

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 
} 

quindi utilizzare

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

Il risultato è il seguente avviso: "XMLHttpRequest sincrono sul thread principale è deprecato a causa dei suoi effetti dannosi per l'esperienza dell'utente finale. " –

2

Questa domanda è un paio di anni, ma ecco un esempio migliore di utilizzo per il gestore degli errori per chi guarda questo.

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

È necessario collegare il gestore degli errori prima di provare a caricare l'immagine per catturare l'evento.

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

0

Questo è quello che ho fatto mio:

$.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 
    } 
});