Ich bin verwirrt über das xhr-Rückgabeereignis, wie ich sehen kann, gibt es nicht so viele Unterschiede zwischen onreadystatechange -> readyState == 4 und onload, stimmt das?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
oder
xhr.onload = function() { /* do something */ }
javascript
ajax
xmlhttprequest
Huang
quelle
quelle
Antworten:
Es sollte dasselbe sein.
onload
wurde in XMLHttpRequest 2 hinzugefügt, währendonreadystatechange
es seit der ursprünglichen Spezifikation existiert.quelle
Das ist fast immer wahr. Ein wesentlicher Unterschied besteht jedoch darin, dass der
onreadystatechange
Ereignishandler auchreadyState==4
in den Fällen ausgelöst wird, in denen deronerror
Handler normalerweise ausgelöst wird (normalerweise ein Problem mit der Netzwerkkonnektivität). In diesem Fall erhält es den Status 0. Ich habe überprüft, ob dies auf den neuesten Versionen von Chrome, Firefox und IE geschieht.Wenn Sie also
onerror
moderne Browser verwenden und darauf abzielen, sollten Sie diese nicht verwenden,onreadystatechange
sondernonload
stattdessen verwenden. Dies scheint garantiert nur dann aufgerufen zu werden, wenn die HTTP-Anforderung erfolgreich abgeschlossen wurde (mit einer echten Antwort und einem Statuscode). Andernfalls werden im Fehlerfall möglicherweise zwei Ereignishandler ausgelöst (so habe ich empirisch von diesem Sonderfall erfahren).Hier ist ein Link zu einem von mir geschriebenen Plunker-Testprogramm , mit dem Sie verschiedene URLs testen und die tatsächliche Abfolge von Ereignissen und
readyState
Werten anzeigen können, die von der JavaScript-App in verschiedenen Fällen angezeigt werden. Der JS-Code ist auch unten aufgeführt:quelle
onload
,readyState === 4
ist garantiert wahr richtig?readyState
sich um 4error
oder auch umabort
Fälle handeln kann. Dieser Zustand bedeutet im Grunde, dass der Ladevorgang erfolgreich abgeschlossen wurde oder nicht. Für ein normales, erfolgreiches Laden lautet die endgültige Abfolge der Ereignisse:progress
(mit allen geladenen Daten),readystatechange
(mitreadyState == 4
)load
,,loadend
.onload
auch nicht auslösen wird, wennNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
Handler auslösen.Nein, sie sind nicht gleich. Wenn Sie auf einen Netzwerkfehler stoßen oder den Vorgang abbrechen,
onload
wird dieser nicht aufgerufen. Eigentlich ist das nächste EreignisreadyState === 4
wäreloadend
. Der Fluss sieht so aus:quelle