Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
* Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.
Dans ce guide, nous verrons comment utiliser XMLHttpRequest afin d'envoyer des requêtes HTTP pour échanger des données entre le site web et un serveur.
Des exemples d'utilisation seront présentés.
Pour envoyer une requête HTTP, on pourra :
Lorsque la transaction sera terminée, l'objet XMLHttpRequest contiendra les informations de la réponse, comme son corps et le statut HTTP résultant.
Une requête envoyée avec XMLHttpRequest peut récupérer les données de façon asynchrone ou de façon synchrone. Le comportement obtenu est choisi avec le troisième argument optionnel async de la méthode XMLHttpRequest.open(). Lorsque cet argument vaut true ou s'il n'est pas fourni, la requête est traitée de façon asynchrone. Sinon, le processus est géré de façon synchrone. Pour en savoir plus sur ces différents types de requêtes, vous pouvez consulter l'article Requêtes synchrones et asynchrones. Les requêtes synchrones ne peuvent pas être utilisées en dehors des workers, car elles bloqueraient l'interface principale.
Note : Le constructeur XMLHttpRequest ne se limite pas aux seuls documents XML. Son nom commence par "XML", car il a été créé lorsque le format d'échange principal était XML.
Il existe plusieurs types d'attributs de réponse définis pour le constructeur XMLHttpRequest(). Ces attributs indiquent au client qui a émis la requête des informations importantes quant au statut de la réponse. Pour les cas où il faut gérer une réponse qui n'est pas du texte, cela peut nécessiter des manipulations et une analyse que nous allons voir dans les sections suivantes.
Lorsqu'on utilise XMLHttpRequest pour obtenir le contenu d'un document XML distant, la propriété responseXML sera un objet DOM qui contient le document XML analysé. La manipulation et l'analyse d'un tel résultat n'est pas nécessairement simple. Il existe quatre méthodes principales pour analyser un tel document XML :
Note : XMLHttpRequest peut également interpréter un document HTML avec la propriété responseXML. Voir l'article à propos de la prise en charge de HTML dans XMLHttpRequest pour apprendre comment faire.
Lorsqu'on utilise XMLHttpRequest afin d'obtenir le contenu d'une page HTML distante, la propriété responseText sera une chaîne de caractères contenant le document HTML brut. La manipulation et l'analyse d'un tel résultat n'est pas nécessairement simple. Il existe trois méthodes principales pour analyser un tel document HTML :
Bien que XMLHttpRequest soit généralement afin d'envoyer et de recevoir des données texte, on peut aussi l'utiliser pour envoyer et recevoir des données binaires. Il existe plusieurs méthodes pour ce faire, qui utilisent la méthode overrideMimeType() :
D'autres techniques plus modernes existent également. En effet responseType prend en charge plusieurs types de contenu, permettant ainsi d'envoyer et de recevoir des données binaires plus facilement.
Prenons le fragment de code qui suit, qui utilise responseType avec "arraybuffer" afin de récupérer le contenu distant dans un objet ArrayBuffer qui stocke les données binaires.
Pour plus d'exemples, voir la page Envoyer et recevoir des données binaires.
XMLHttpRequest permet d'écouter différents évènements qui se produisent lors du traitement de la requête. Parmi ces évènements, on trouve de quoi notifier l'avancement, les erreurs, etc.
Pour suivre l'évolution d'un transfert avec XMLHttpRequest, on utilisera progress qui implémente l'interface ProgressEvent. Les évènements qui peuvent être écoutés pour connaître l'avancement de la requête sont :
progressLa quantité de données reçues a changé.
loadLe transfert est terminé. Toutes les données sont désormais écrites dans response.
Les lignes 3 à 6 du fragment ci-avant ajoutent les gestionnaires d'évènements pour les différents évènements émis à propos du transfert des données à l'aide de XMLHttpRequest.
Note : Ces gestionnaires d'évènements doivent être ajoutés avant d'appeler open() sur la requête. Sinon, les évènements progress ne seront pas captés.
Le gestionnaire d'évènement pour l'avancement, porté par la fonction updateProgress() dans l'exemple, reçoit le nombre total d'octets à transférer (total) ainsi que le nombre d'octets transférés jusqu'à présent (loaded). Toutefois, si le champ lengthComputable vaut false, la longueur totale est inconnue et vaudra 0 par défaut.
Les évènements d'avancement existent pour les téléchargements (downloads) et les téléversements (uploads). Pour les téléchargements, les évènements sont déclenchés sur l'objet XMLHttpRequest, comme illustré dans l'exemple précédent. Pour les téléversements, les évènements sont déclenchés sur l'objet XMLHttpRequest.upload, comme ceci :
Note : Les évènements d'avancement ne sont pas disponibles pour le protocole file:.
Les évènements d'avancements sont émis à chaque fragment (chunk) de données reçu, y compris le dernier fragment pour les cas où le paquet est reçu et la connexion fermée avant que l'évènement soit déclenché. Dans ce cas, l'évènement progress est automatiquement déclenché lorsque l'évènement load se produit pour ce paquet. Cela permet de surveiller l'avancement de façon fiable, à l'aide du seul évènement progress.
On peut également détecter les trois conditions de fin de chargement (abort, load, ou error) à l'aide de l'évènement loadend :
Il n'y a pas de certitude possible quant à l'information reçue par l'évènement loadend pour déterminer la condition de l'arrêt. Toutefois, cet évènement permet de gérer les tâches nécessaires à la fin des transferts.
Créons deux fonctions :
Pour tester cet exemple :
Si vous souhaitez savoir si la page actuelle a changé, voyez l'article document.lastModified.
Les navigateurs prennent en charge les requêtes entre différents sites/origines en implémentant le standard CORS (Cross-Origin Resource Sharing (pour « partage des ressources entre différentes origines »). Tant que le serveur est configuré afin d'autoriser les requêtes depuis l'origine de votre application web, XMLHttpRequest fonctionnera correctement. Dans le cas contraire, une exception INVALID_ACCESS_ERR sera déclenchée.
Pour outrepasser le cache avec une méthode qui fonctionne dans les différents navigateurs, on pourra ajouter un horodatage à l'URL en s'assurant d'encoder correctement la valeur (avec ? ou & où c'est nécessaire). Ainsi :
http://example.com/truc.html -> http://example.com/truc.html?12345 http://example.com/truc.html?bidule=machin -> http://example.com/truc.html?bidule=machin&12345Le cache local étant indexé avec les URL, chaque requête sera ainsi unique et passera outre le cache.
On peut ajuster les URL automatiquement avec le code qui suit :
La méthode recommandée pour autoriser les requêtes scriptées entre différentes origines est d'inclure l'en-tête HTTP Access-Control-Allow-Origin dans la réponse à la requête XHR.
Si votre requête XHR se termine avec status=0 et statusText=null, cela signifie que son exécution n'a pas été autorisée. Elle n'a pas été envoyée (UNSENT). Cela se produit généralement lorsque l'origine de la requête a changé entre la création et l'ouverture qui suit avec open(). Cela peut par exemple se produire lorsqu'une requête XHR est déclenchée pour un évènement onunload d'une fenêtre. La requête est créée lorsque la fenêtre à fermer existe encore, mais l'envoi qui suit (avec open()) se produit lorsque la fenêtre a perdu le focus et l'a passé à une autre fenêtre. Pour éviter ce problème, le mieux consistera à placer un gestionnaire d'évènements DOMActivate sur la nouvelle fenêtre lorsque la fenêtre à fermer reçoit l'évènement unload.
| XMLHttpRequest # interface-xmlhttprequest |
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Cette page a été modifiée le 9 oct. 2025 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.