Navigator.sendBeacon()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2018.
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
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ésout 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
Specification |
---|
Beacon # sendbeacon-method |
Compatibilité des navigateurs
BCD tables only load in the browser
Voir aussi
navigator
WorkerNavigator.sendBeacon()
(Utilisation desendBeacon()
dans des workers)