2011-11-13 17 views
9

Ho una pagina con molte immagini generate lato server in base alle azioni dell'utente. E quando l'immagine si carica con successo, sono felice, ma quando c'è un errore sul server devo agire in base a quale errore si è verificato.Come ottenere il codice di stato HTTP dei tag <img>

Ad esempio:

codice
  • 500: fare questa roba.
  • 503 Codice: fare quella roba

e così via.

Quindi, la mia domanda: c'è un modo per ottenere il codice di stato all'interno del gestore di eventi on-error del tag "img"?

+1

Perché diavolo avresti mai gestito tali problemi sul client? Perché non hai il server per gestire correttamente queste immagini? – Raynos

+2

@Raynos la situazione è tale: le immagini vengono create dinamicamente sul server, ma ci vuole un sacco di tempo, il che significa che alcune di esse non saranno pronte quando il browser le richiederà. Allo stesso tempo, potrebbe verificarsi un errore critico sul lato server e non ci sarà alcuna immagine. Quindi, in base allo stato HTTP, devo chiedere nuovamente al server le immagini, o semplicemente informare l'utente, sull'errore. –

+0

No, stai ancora sbagliando. Hai un server HTTP, quando ricevi una richiesta GET in arrivo per un'immagine puoi "aspettare" che sia pronta. E se si è verificato un errore critico, è possibile restituire un'immagine di "errore critico". – Raynos

risposta

8

No, non c'è modo di ottenere lo stato HTTP da una richiesta effettuata da un tag img in JavaScript.

Si potrebbe scrivere un plug-in firefox, estensione chrome/safari per farlo.

Un'alternativa potrebbe essere l'utilizzo di AJAX per caricare le immagini (non utilizzando i tag img). Puoi ottenere i codici di stato Http dalle richieste Ajax.

+0

Plugin non è accettabile. AJAX sembra andare bene, ma che tipo di dati dovrei ottenere attraverso AJAX? Posso recuperare i dati dell'immagine, ma non posso usarli per creare elementi img. –

+0

Probabilmente dovresti inviarlo come URL di dati. Probabilmente dovrai trovare un qualche tipo di libreria in grado di generare url di dati sul lato server. Quindi, una volta arrivati, è solo questione di impostare imr's src sull'URL dei dati. Ciò aggiungerà un bel po 'di sovraccarico al caricamento delle immagini. La vera soluzione è probabilmente quella di riparare il server in modo che invii sempre le immagini con successo. –

+0

L'Ajax non è una buona sostituzione nel caso in cui le tue immagini di caricamento siano posizionate su un dominio esterno. Qualcosa di nuovo su questo problema nel 2016? – Fusion

-4

è necessario aggiungere un EventListener sulle immagini:

Ad esempio, con jQuery:

$('#your_image') 
    .error(function(e) { 
     //add your unhappy code here 

     //unbind if needed 
     $(this).unbind('error'); 
    }) 
    .load(function(e) { 
     //add your happy code here 

     //unbind if needed 
     $(this).unbind('load'); 
    }) 
    ; 
+1

Ok. Esiste un codice di stato nell'oggetto eventData "e"? –

+0

Si noti che, dalla [API per '.error() ':] (http://api.jquery.com/api/error/)" Il gestore di eventi ** deve ** essere allegato ** prima ** il browser attiva l'evento di errore, motivo per cui l'esempio imposta l'attributo src ** dopo ** allegando il gestore. " (** sottolinea ** il mio). –

+10

buttati un po 'di jQuery, sicuramente risolverà il problema! – Raynos

4

Non è possibile controllare lo stato HTTP in questo modo. Tuttavia, è possibile verificare se l'immagine è stata caricata o non utilizzando la proprietà naturalWidth.

if (img.naturalWidth === 0) { 
    // do sth 
} 

Spero che sia d'aiuto.

+2

Per chiunque legga questa pagina, la proprietà naturalWidth non è supportata da tutti i browser. Questa proprietà è anche abbastanza permissiva: dovresti solo tentare di leggerla dopo che l'immagine è stata caricata. (http://stackoverflow.com/questions/1645166/image-naturalwidth-return-zero) Spero che questo aiuti. :) – Axle

+0

@Axle Ti stai riferendo al post di '09. Ora funziona in tutte le versioni più recenti dei browser. –

+0

Mi capita di lavorare da qualche parte che lo rende un requisito per supportare i browser più vecchi (ad esempio IE 7 e IE 8). Sono sicuro che ci sono altri là fuori che subiscono un destino simile. Fidati di me, urlando "Beh, dovrebbero solo aggiornare i loro strumenti rotti!" non mi ha mai portato da nessuna parte : P – Axle

Problemi correlati