J'ai un peu de mal à comprendre les gestionnaires de XMLHttpRequest
. La spécification le dit à propos du gestionnaire onerror
:
error
[Distribué ...] Lorsque la demande a échoué.
load
[Distribué ...] Lorsque la demande s'est terminée avec succès.
Le problème est, qu'est-ce que cela signifie que "la demande a échoué". Cela pourrait être
De plus, j'aimerais savoir si cela signifie que onerror
et onload
ne devraient jamais se déclencher simultanément.
Cette référence indique que le gestionnaire onerror
doit être exécuté selon le code status
et onload
selon readyState
. Cela indiquerait qu'ils ne s'excluent pas mutuellement, cependant, je ne pense pas que ce soit une information faisant autorité.
Je pose la question car en utilisant le dernier Opera snapshot, j'ai trouvé que onload
est tiré même sur le code d'état 404. Je sais que tester status
est un pari sûr, mais je voudrais savoir si c'est quelque chose que je dois faire par spécification ou simplement une solution de contournement pour un bogue dans Opera.
Comme mentionné dans les commentaires, onerror
se déclenche en cas de panne sur le niveau résea. Si l'erreur existe uniquement au niveau de l'application, par exemple, un code d'erreur HTTP est envoyé, alors onload
se déclenche toujours. Vous devez tester explicitement le code d'état renvoyé dans votre gestionnaire onreadystatechange
.
Notez qu'une demande interdomaine refusée déclenchera également le gestionnaire onerror
.
En plus de la réponse d'Apsillers, notez que XMLHttpRequest gère automatiquement les redirections en arrière-plan, vous n'avez donc pas à vérifier ces codes de réponse dans l'événement onload
(cet événement ne sera invoqué qu'une seule fois - le dernier appel). Notez également que si vous envoyez des données utiles avec la méthode POST et si les demandes sont redirigées, XMLHttpRequest modifie la méthode de POST
à GET
et rejette toutes les données utiles pour des raisons de sécurité. L'événement onload
sera toujours invoqué mais vous devrez renvoyer manuellement votre demande vers la nouvelle destination.