Navigator.sendBeacon()

Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

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écahrgement 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.
Brouillon de l'éditeur Définition initiale

Compatibilité avec les navigateurs

Fonctionnalité Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Support de base 39.0 (Oui) 31 (31) Pas de support 26 Pas de support
Fonctionnalité Android Android Webview Edge Firefox Mobile (Gecko) Firefox OS IE Mobile Opera Mobile Safari Mobile Chrome for Android
Support de base Pas de support 40.0 (Oui) 31.0 (31) 2.5 Pas de support Pas de support Pas de support 42.0

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : fireyoshiqc
 Dernière mise à jour par : fireyoshiqc,