Quando dovrebbe XMLHttpRequest onerror gestore di fuoco

Ho un piccolo problema di comprensione XMLHttpRequest‘s gestori. La specifica dice questo circa il onerror gestore:

error [Spediti … ] Quando la richiesta non è riuscita.

load [Spediti … ] Quando la richiesta è stata completata correttamente.

Il problema è, che cosa significa che “la richiesta non riuscita”. Che potrebbe essere

  • la richiesta non poteva essere rilasciato a tutti (es. Connessione rifiutata e tali errori), o
  • di cui sopra più il server ha restituito un codice di errore (es. 404)

Mi piacerebbe anche sapere se significa onerror e onload non dovrebbe mai fuoco contemporaneamente.

Questo riferimento indica il onerror gestore deve essere eseguita, a seconda della status codice e onload a seconda readyState. Che indica che non si escludono a vicenda, tuttavia, non credo che questo è un autorevole di informazioni.

Mi sto chiedendo perché utilizzando la più recente Opera di snapshot, ho trovato onload è sparato anche sul codice di stato 404. So che il test status è una scommessa sicura, ma mi piacerebbe sapere se è qualcosa che devo fare per specifica o solo una soluzione per un bug in Opera.

  • Prendo has completed successfully significa che si riceve un codice di stato, sia che si tratti di 200 OK o un codice di errore, come 404. Chrome incendi onload anche se il codice di stato è uno stato di errore di codice.
  • onerror e onload mai il fuoco contemporaneamente. O è uno o è l’altro. Tuttavia onloadend incendi in entrambi i casi ed è l’ultimo evento in riga.
InformationsquelleAutor jpalecek | 2012-05-14



2 Replies
  1. 67

    Come accennato nei commenti, onerror scatta quando c’è un guasto sulla a livello di rete. Se l’errore esiste solo sul livello di applicazione, ad esempio, un codice di errore HTTP viene inviato, quindi onload ancora incendi. Per testare il codice di stato restituito in modo esplicito nel onreadystatechange gestore.

    Nota che una negato domini richiesta anche fuoco il onerror gestore.

    • Uhm, strano. Si può (o di chiunque) spiega che il comportamento del server di google?
    • Ho fatto una più completa di test e ha scoperto che encrypted.google.com non inviare 404 per la richiesta — il status membro del XHR richiesta è in realtà 0, dove altri server invia un 404. A quanto pare, il server, improvvisamente, fanno finta che non esiste, quando si vede una richiesta per una pagina che non esiste. Strano, ma che la decisione di Google.
    • Oppure… potrebbe essere perché colpire https://encrypted.google.com/foobar reindirizza a http://www.google.com/foobar, e il browser si rifiuta di partecipare ad un cross-dominio redirect durante una richiesta Ajax.
    • Che sarebbe. Il browser invia una richiesta al http://www.google.com/foobar, vede che non c’è Access-Control-Allow-Origin intestazione nella risposta e si rifiuta di dare qualsiasi script.
    • Come si fa a distinguere il che cosa a livello di rete guasto si è verificato? Alcuni che mi vengono in mente sono: la ricerca DNS non è riuscita, connessione rifiutata, scaduta il tentativo di contattare il server, scaduto in attesa di una risposta, negato a causa di CORS, e connessione terminata in modo anomalo.
    • Io sono più curioso di dove hai preso questo particolare pezzo di conoscenza. Un po ‘ di documentazione da qualche parte? O anche il codice sorgente? Sto avendo lo stesso problema oggi e mi resi conto di non sapere dove devo girare per.
    • XHR comportamento è specificato da WHATWG XHR spec che di tanto in tanto di link per il WHATWG Fetch spec per alcuni CORS comportamento. Potrebbe essere la pena di cercare per ogni volta che il termine error appare come un punto di partenza.
    • Ah l’ho trovato qui: A response whose type is "error" is known as a network error.

  2. 2

    Oltre a apsillers’ risposta, nota che XMLHttpRequest maniglie reindirizza automaticamente in background, quindi non è necessario controllare per questo i codici di risposta, in onload evento (l’evento sarà richiamato solo una volta – sul finale di chiamata). Si noti inoltre, che nel caso in cui si invia il payload di dati con il metodo POST e se le richieste viene reindirizzato XMLHttpRequest modificare il metodo da POST per GET e ignora qualsiasi carico utile di dati per motivi di sicurezza. Il onload evento sarà ancora invocato, ma avrete bisogno di ri-inviare la tua richiesta di nuovo manualmente per la nuova destinazione.

Lascia un commento