Je suis confus au sujet de l'événement de retour xhr, comme je peux le dire, il n'y a pas tellement de différence entre onreadystatechange -> readyState == 4 et onload, est-ce vrai?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
ou
xhr.onload = function() { /* do something */ }
Réponses:
Ça devrait être la même chose.
onload
a été ajouté dans XMLHttpRequest 2 alors qu'ilonreadystatechange
existe depuis la spécification d'origine.la source
C'est presque toujours vrai. Une différence significative, cependant, est que le
onreadystatechange
gestionnaire d'événements est également déclenchéreadyState==4
dans les cas où leonerror
gestionnaire est généralement déclenché (généralement un problème de connectivité réseau). Il obtient le statut 0 dans ce cas. J'ai vérifié que cela se produit sur les derniers Chrome, Firefox et IE.Donc, si vous utilisez
onerror
et ciblez des navigateurs modernes, vous ne devriez pas utiliseronreadystatechange
maisonload
plutôt utiliser , ce qui semble être garanti uniquement lorsque la requête HTTP s'est terminée avec succès (avec une réponse réelle et un code d'état). Sinon, vous risquez de déclencher deux gestionnaires d'événements en cas d'erreurs (c'est ainsi que j'ai découvert empiriquement ce cas particulier.)Voici un lien vers un programme de test Plunker que j'ai écrit qui vous permet de tester différentes URL et de voir la séquence réelle des événements et des
readyState
valeurs vues par l'application JavaScript dans différents cas. Le code JS est également répertorié ci-dessous:la source
onload
, ilreadyState === 4
est garanti que c'est vrai, non?readyState
peut être 4 surerror
ou desabort
cas aussi. Cet état signifie essentiellement que le processus de chargement est terminé, qu'il soit réussi ou non. Pour un chargement normal et réussi, la dernière séquence d'événements est:progress
(avec toutes les données chargées),readystatechange
(avecreadyState == 4
)load
,,loadend
.onload
cela ne déclenchera pas non plus siNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
gestionnaire.Non, ils ne sont pas les mêmes. Si vous rencontrez une erreur réseau ou abandonnez l'opération,
onload
ne sera pas appelé. En fait, l'événement le plus prochereadyState === 4
seraitloadend
. Le flux ressemble à ceci:la source