web-dev-qa-db-fra.com

Quand le gestionnaire d'erreurs XMLHttpRequest doit-il se déclencher

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

  • la demande n'a pas pu être émise (par exemple, connexion refusée et erreurs de ce type), ou
  • ce qui précède et le serveur ont renvoyé un code d'erreur (par exemple 404)

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.

42
jpalecek

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.

64
apsillers

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.

2
StanE