Jestem zdezorientowany co do zdarzenia powrotu xhr, jak mogę powiedzieć, nie ma tak dużej różnicy między onreadystatechange -> readyState == 4 i onload, czy to prawda?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
lub
xhr.onload = function() { /* do something */ }
javascript
ajax
xmlhttprequest
Huang
źródło
źródło
Odpowiedzi:
Powinno być tym samym.
onload
został dodany w XMLHttpRequest 2, podczas gdyonreadystatechange
istnieje od pierwotnej specyfikacji.źródło
To prawie zawsze prawda. Jedną istotną różnicą jest jednak to, że
onreadystatechange
procedura obsługi zdarzeń jest również wyzwalanareadyState==4
w przypadkach, w którychonerror
procedura obsługi jest zwykle wyzwalana (zwykle jest to problem z łącznością sieciową). W tym przypadku otrzymuje status 0. Sprawdziłem, że dzieje się to w najnowszej przeglądarce Chrome, Firefox i IE.Jeśli więc używasz
onerror
nowoczesnych przeglądarek i kierujesz ich na cel, nie powinieneś używać,onreadystatechange
aleonload
zamiast tego powinieneś używać , co wydaje się gwarantować, że zostanie wywołane tylko wtedy, gdy żądanie HTTP zostanie pomyślnie zakończone (z prawdziwą odpowiedzią i kodem stanu). W przeciwnym razie możesz otrzymać dwa programy obsługi zdarzeń wyzwalane w przypadku błędów (i tak empirycznie dowiedziałem się o tym szczególnym przypadku).Oto link do napisanego przeze mnie programu testowego Plunker , który pozwala przetestować różne adresy URL i zobaczyć rzeczywistą sekwencję zdarzeń i
readyState
wartości, jaką widzi aplikacja JavaScript w różnych przypadkach. Kod JS jest również wymieniony poniżej:źródło
onload
,readyState === 4
jest gwarancją prawdziwej prawo?readyState
4 włączoneerror
lubabort
przypadki. Ten stan zasadniczo oznacza, że proces ładowania został zakończony, niezależnie od tego, czy zakończył się pomyślnie, czy nie. W przypadku normalnego, pomyślnego załadowania końcowa sekwencja zdarzeń to:progress
(z załadowanymi wszystkimi danymi),readystatechange
(zreadyState == 4
)load
,,loadend
.onload
również nie uruchomi się, jeśliNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
obsługi.Nie, to nie to samo. Jeśli napotkasz błąd sieciowy lub przerwiesz operację,
onload
nie zostanie wywołany. Właściwie najbliższym wydarzeniemreadyState === 4
byłobyloadend
. Przepływ wygląda następująco:źródło