2012-05-14 10 views
36

Ich habe ein kleines Problem zu verstehen XMLHttpRequest 's Handler. :Wann sollte XMLHttpRequest Onerror Handler Feuer

error [Wird gesendet ...] Wenn die Anforderung fehlgeschlagen ist.

load [Abgelöst ...] Wenn die Anfrage erfolgreich abgeschlossen wurde.

Das Problem ist, was bedeutet, dass "die Anfrage fehlgeschlagen ist". Das könnte

  • die Anforderung nicht an alle ausgegeben werden kann (z. B. Verbindung abgelehnt und solche Fehler) oder
  • die oben plus der Server einen Fehlercode zurückgegeben (z. B. 404)

Ich würde auch gerne wissen, ob es bedeutet onerror und onload sollte nie gleichzeitig feuern.

This reference zeigt die onerror Handler sollten in Abhängigkeit von dem auf readyState je status Code und onload ausgeführt werden. Das würde bedeuten, dass sie sich nicht gegenseitig ausschließen, aber ich denke nicht, dass dies eine autoritative Information ist.

Ich frage, weil mit der neuesten Opera Snapshot, fand ich onload wird gefeuert sogar auf 404 Statuscode. Ich weiß, dass Testen status eine sichere Wette ist, aber ich würde gerne wissen, ob es etwas ist, was ich nach Spezifikation tun muss oder nur eine Abhilfe für einen Fehler in Opera.

+4

Ich nehme "erfolgreich abgeschlossen" bedeutet, dass Sie einen Statuscode erhalten, sei es 200 OK oder ein Fehlercode wie 404. Chrome feuert auch Onload, auch wenn der Statuscode ein Fehlerstatuscode ist. – Snuffleupagus

+1

onerror und onload feuern niemals gleichzeitig. Es ist entweder das eine oder das andere. Onloadend feuert jedoch in beiden Fällen und ist das letzte Ereignis in der Reihe. – jayarjo

Antwort

57

Wie in den Kommentaren erwähnt, wird onerror ausgelöst, wenn es einen Fehler auf Netzwerkebene gibt. Wenn der Fehler nur auf Anwendungsebene auftritt, z. B. ein HTTP-Fehlercode gesendet wird, wird weiterhin onload ausgelöst. Sie müssen den zurückgegebenen Statuscode explizit in Ihrem Handler onreadystatechange testen.

Beachten Sie, dass eine abgelehnte domänenübergreifende Anforderung auch den onerror-Handler auslöst.

+0

Hmm, komisch. Können Sie (oder irgendjemand) dieses Verhalten von Google Server erklären? – jpalecek

+0

Ich habe einen vollständigeren Test durchgeführt und festgestellt, dass chrcrier.google.com 404 für diese Anforderung nicht sendet - das 'status'-Mitglied der XHR-Anfrage ist tatsächlich '0', wobei andere Server eine 404 senden.Scheinbar gibt der Server plötzlich vor, dass er überhaupt nicht existiert, wenn er eine Anfrage für eine Seite sieht, die nicht existiert. Seltsam, aber das ist Googles Entscheidung. – apsillers

+6

Oder ... es könnte sein, weil das Klicken auf "https: // encrypted.google.com/foobar" zu "http: // www.google.com/foobar" umleitet und der Browser sich weigert, an einer Domain-Redirect während einer Ajax-Anfrage. – apsillers

1

Neben der Antwort von apsillers ist zu beachten, dass XMLHttpRequest automatisch im Hintergrund weiterleitet, so dass Sie im Ereignis onload nicht nach diesen Antwortcodes suchen müssen (dieses Ereignis wird nur einmal beim letzten Aufruf aufgerufen)). Beachten Sie auch, dass XMLHttpRequest die Methode von POST zu GET ändert und aus Sicherheitsgründen alle Nutzlastdaten verwirft, falls Sie Nutzdaten mit der POST-Methode senden und die Anforderungen umgeleitet werden. Das Ereignis onload wird weiterhin aufgerufen, Sie müssen Ihre Anforderung jedoch erneut manuell an das neue Ziel senden.