Navigator.sendBeacon()

La méthode  navigator.sendBeacon() peut être utilisée pour transférer une petite quantité de données de façon asynchrone via  HTTP vers un serveur web.

Syntaxe

navigator.sendBeacon(url, donnees);

Paramètres

url
Le paramètre url indique l'URL résolue à laquelle les donnees seront transmises.
donnees
Le paramètre donnees est un objet ArrayBufferView, Blob, DOMString, ou FormData qui contient les données à transmettre.

Valeurs de retour

La méthode sendBeacon() retourne true (vrai) si l'agent utilisateur est en mesure de mettre en file les données à transférer avec succès. Sinon, la méthode retourne false (faux).

Description

Cette méthode répond aux besoins de certains codes analytiques ou de diagnostic qui tentent d'envoyer des données à un serveur web avant le déchargement (unloading) du document. Envoyer les données plus tôt pourrait résulter en une opportunité manquée de récolter des données. Toutefois, s'assurer que les données ont été envoyées pendant le déchargement du document est quelque chose qui a traditionnellement été difficile pour les développeurs, car les agents utilisateur ignorent généralement les requêtes XMLHttpRequest faites à l'intérieur d'un gestionnaire d'événements unload.

Afin de résoudre ce problème, les codes analytiques ou de diagnostic faisaient historiquement appel à une requête XMLHttpRequest synchrone dans un gestionnaire d'événements unload ou beforeunload pour soumettre les données. La requête XMLHttpRequest synchrone bloque le processus de déchargement du document, ce qui à son tour fait paraître la navigation plus lente. Il n'y a rien que la page suivante peut faire pour éviter cette perception d'une mauvaise performance de chargement de page, et le résultat est que l'utilisateur perçoit la nouvelle page web comme étant lente à se charger, même si le vrai problème provient de la page précédente.

Il y a des techniques de contournement qui ont été utilisées pour s'assurer que ce type de données est transmis. Une technique de ce genre est de retarder le déchargement de la page pour soumettre  les données en créant un élément <img> et en mettant son attribut src dans le gestionnaire de déchargement. Puisque la plupart des agents utilisateur vont retarder le déchargement afin de compléter le chargement de l'image en attente, les données peuvent être transmises durant le déchargement. Une autre technique est de créer une boucle de no-op (aucune opération) pour plusieurs secondes à l'intérieur du gestionnaire de déchargement, afin de retarder le déchargement et soumettre les données au serveur.

Non seulement ces techniques représentent-elles de mauvais patrons de programmation, certaines d'entre elles sont peu fiables, et elles résultent toutes en une perception d'une mauvaise performance de chargement de page pour la prochaine navigation.

L'exemple suivant montre un code analytique théorique qui tente de soumettre des données à un serveur en utilisant une requête XMLHttpRequest synchrone dans un gestionnaire de déchargement. Cela résulte en un délai pour le déchargement de la page.

window.addEventListener('unload', enregistrerDonnees, false);

function enregistrerDonnees() {
  var client = new XMLHttpRequest();
  client.open("POST", "/log", false); // Le troisième paramètre indique une synchronisation xhr
  client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  client.send(donneesAnalytiques);
}

C'est là qu'entre en jeu sendBeacon(). En utilisant la méthode sendBeacon(), les données sont transmises de façon asynchrone au serveur web lorsque l'Agent Utilisateur a l'opportunité de le faire, sans retarder le déchargement ou affecter la performance de la navigation suivante. Cela résoud tous les problèmes avec la soumission de données analytiques : les données sont envoyées de façon fiable, asynchrone, et cela n'impacte pas le chargement de la page suivante. De plus, ce code est en fait plus simple à écrire que n'importe quelle de ces autres techniques!

L'exemple suivant montre un patron de code analytique théorique qui soumet des données à un serveur en utilisant la méthode sendBeacon().

window.addEventListener('unload', enregistrerDonnees, false);

function enregistrerDonnees() {
  navigator.sendBeacon("/log", donneesAnalytiques);
}

Spécifications

Spécification Statut Commentaire
Beacon
La définition de 'sendBeacon()' dans cette spécification.
Candidat au statut de recommandation Définition initiale

Compatibilité avec les navigateurs

 

Update compatibility data on GitHub
OrdinateurMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidFirefox pour AndroidOpera pour AndroidSafari sur iOSSamsung Internet
sendBeaconChrome Support complet 39
Notes
Support complet 39
Notes
Notes Starting in Chrome 59, this method cannot send a Blob whose type is not CORS safelisted. This is a temporary change until a mitigation can be found for the security issues that this creates. For more information see Chrome bug 720283.
Edge Support complet 14Firefox Support complet 31IE Aucun support NonOpera Support complet 26
Notes
Support complet 26
Notes
Notes Starting in Opera 46, this method cannot send a Blob whose type is not CORS safelisted. This is a temporary change until a mitigation can be found for the security issues that this creates. For more information see Chrome bug 720283.
Safari Support complet 11.1WebView Android Support complet 40
Notes
Support complet 40
Notes
Notes Starting in Chrome 59, this method cannot send a Blob whose type is not CORS safelisted. This is a temporary change until a mitigation can be found for the security issues that this creates. For more information see Chrome bug 720283.
Chrome Android Support complet 42
Notes
Support complet 42
Notes
Notes Starting in Chrome 59, this method cannot send a Blob whose type is not CORS safelisted. This is a temporary change until a mitigation can be found for the security issues that this creates. For more information see Chrome bug 720283.
Firefox Android Support complet 31Opera Android Support complet 26
Notes
Support complet 26
Notes
Notes Starting in Opera 46, this method cannot send a Blob whose type is not CORS safelisted. This is a temporary change until a mitigation can be found for the security issues that this creates. For more information see Chrome bug 720283.
Safari iOS Support complet 11.1Samsung Internet Android Support complet Oui

Légende

Support complet  
Support complet
Aucun support  
Aucun support
Voir les notes d'implémentation.
Voir les notes d'implémentation.

 

Voir aussi