Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Navigator: sendBeacon()-Methode

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit April 2018 browserübergreifend verfügbar.

Die Methode navigator.sendBeacon() sendet asynchron eine HTTP-POST-Anfrage mit einer kleinen Datenmenge an einen Webserver.

Sie ist dafür vorgesehen, Analysedaten an einen Webserver zu senden. Dabei vermeidet sie einige Probleme älterer Verfahren zur Übermittlung solcher Daten, etwa bei der Verwendung von XMLHttpRequest.

Hinweis: Wenn Sie Anfragen mit anderen Methoden als POST senden, Eigenschaften der Anfrage ändern oder auf die Serverantwort zugreifen müssen, verwenden Sie stattdessen die Methode fetch() mit keepalive auf true gesetzt.

Syntax

js
sendBeacon(url)
sendBeacon(url, data)

Parameter

url

Die URL, an die data gesendet wird. Sie kann relativ oder absolut sein.

data Optional

Ein ArrayBuffer, ein TypedArray, eine DataView, ein Blob, ein String-Literal oder -Objekt, ein FormData- oder ein URLSearchParams-Objekt mit den zu sendenden Daten. Die Gesamtgröße der zur Übertragung eingereihten Daten ist auf 64 KiB (65.536 Byte) begrenzt.

Rückgabewert

Gibt true zurück, wenn der User-Agent data erfolgreich zur Übertragung eingereiht hat. Andernfalls wird false zurückgegeben.

Beschreibung

Diese Methode ist für Analyse- und Diagnosecode vorgesehen, der Daten an einen Server sendet.

Beim Senden von Analysedaten ergibt sich ein Problem: Eine Website möchte solche Daten häufig senden, wenn ein Benutzer die Seite verlässt, beispielsweise beim Navigieren zu einer anderen Seite. Der Browser ist dann möglicherweise bereits dabei, die Seite zu entladen. In diesem Fall kann er entscheiden, asynchrone Anfragen mit XMLHttpRequest nicht mehr zu senden.

Früher haben Webseiten versucht, das Entladen der Seite lange genug zu verzögern, um die Daten zu senden. Dazu nutzten sie Behelfslösungen wie:

  • Senden der Daten mit einem blockierenden, synchronen XMLHttpRequest-Aufruf.
  • Erstellen eines <img>-Elements und Setzen seiner src. Die meisten User-Agents verzögern das Entladen, um das Bild zu laden.
  • Ausführen einer Schleife ohne weitere Funktion für mehrere Sekunden.

All diese Methoden blockieren das Entladen des Dokuments und verlangsamen dadurch die Navigation zur nächsten Seite. Die nächste Seite kann dies nicht verhindern und wirkt deshalb langsam, obwohl die Ursache auf der vorherigen Seite liegt.

Mit der Methode sendBeacon() werden die Daten asynchron übertragen, sobald der User-Agent dazu Gelegenheit hat, ohne das Entladen oder die nächste Navigation zu verzögern. Das bedeutet:

  • Die Daten werden zuverlässig gesendet.
  • Sie werden asynchron gesendet.
  • Das Laden der nächsten Seite wird nicht beeinträchtigt.

Die Daten werden als HTTP-POST-Anfrage gesendet.

Allerdings ist die Größe der Nutzdaten auf etwa 64 KiB begrenzt. Für die Übertragung größerer Datenmengen sollten Sie stattdessen fetch() verwenden.

Analysedaten am Ende einer Sitzung senden

Websites möchten häufig Analyse- oder Diagnosedaten an den Server senden, wenn ein Benutzer die Seite verlässt. Am zuverlässigsten geschieht dies beim Ereignis visibilitychange:

js
document.addEventListener("visibilitychange", () => {
  if (document.visibilityState === "hidden") {
    navigator.sendBeacon("/log", analyticsData);
  }
});

Frühere Ereignisse

Früher haben viele Websites die Ereignisse unload, beforeunload oder pagehide verwendet, um am Ende einer Sitzung Analysedaten zu senden. Das ist jedoch unzuverlässig. In vielen Situationen, insbesondere auf Mobilgeräten, löst der Browser diese Ereignisse nicht aus. Beispielsweise werden sie in der folgenden Situation nicht ausgelöst:

  1. Der Benutzer lädt die Seite und interagiert mit ihr.
  2. Danach wechselt er zu einer anderen App, statt den Tab zu schließen.
  3. Später schließt er die Browser-App über die App-Verwaltung des Telefons.

Außerdem ist das Ereignis unload nicht mit dem in modernen Browsern implementierten Back/Forward-Cache (bfcache) kompatibel. Einige Browser, etwa Firefox, begegnen dieser Inkompatibilität, indem sie Seiten mit unload-Handlern vom bfcache ausschließen. Das beeinträchtigt die Leistung. Andere, etwa Safari und Chrome unter Android, lösen das Ereignis unload nicht aus, wenn der Benutzer im selben Tab zu einer anderen Seite navigiert.

Das Ereignis pagehide ist weniger problematisch als unload, da es mit dem bfcache kompatibel ist. Allerdings ist es ebenso wenig zuverlässig. Entwickler sollten stattdessen visibilitychange verwenden.

Beispiele

Das folgende Beispiel definiert einen Handler für das Ereignis visibilitychange. Der Handler ruft sendBeacon() auf, um Analysedaten zu senden.

js
document.addEventListener("visibilitychange", () => {
  if (document.visibilityState === "hidden") {
    navigator.sendBeacon("/log", analyticsData);
  }
});

Spezifikationen

Spezifikation
Beacon
# sendbeacon-method

Browser-Kompatibilität

Siehe auch