Signatur
Beschreibung
navigator.presentation ist der Einstiegspunkt der Presentation API. Mit ihr zeigt eine Webseite Inhalte auf einem zweiten Bildschirm an, etwa auf einem Beamer, einem externen Monitor oder einem per Chromecast verbundenen Fernseher. Die Eigenschaft liefert ein Presentation-Objekt, das je nach Kontext zwei Rollen übernimmt.
- Steuernde Seite (Controller): Über
presentation.defaultRequestlegt die Seite einen Standard-PresentationRequestfest, den der Browser zum Beispiel über sein Menü „Streamen…“ nutzt. Die eigentliche Präsentation startet meist mitnew PresentationRequest(urls).start(). - Empfangende Seite (Receiver): Auf der Seite, die auf dem zweiten Bildschirm läuft, liefert
presentation.receivereinPresentationReceiver-Objekt. Darüber erreicht die Seite die eingehenden Verbindungen (connectionList). In einem normalen Browserkontext istreceivernull.
Die Eigenschaft ist sinnvoll für Präsentations-, Foliensatz- oder Mediaplayer-Anwendungen, bei denen ein Gerät steuert und ein anderes anzeigt. Weil die API nur in Chromium-Browsern verfügbar ist, solltest du vor der Nutzung immer mit Feature-Detection prüfen, ob sie vorhanden ist.
Rückgabewert
Presentation-Objekt mit den Eigenschaften defaultRequest (PresentationRequest | null) und receiver (PresentationReceiver | null). In Browsern ohne Unterstützung ist die Eigenschaft nicht vorhanden, der Zugriff liefert dann undefined.Beispiele
Unterstützung prüfen
const hasPresentation = 'presentation' in navigator && navigator.presentation !== null;
if (hasPresentation) {
console.log('Presentation API verfügbar');
console.log('Empfängerkontext:', navigator.presentation.receiver !== null);
} else {
console.log('Presentation API nicht unterstützt');
}
Standard-Präsentationsanfrage für das Browser-Menü setzen
if (navigator.presentation) {
const request = new PresentationRequest(['/slides/receiver.html']);
// Der Browser nutzt diese Anfrage z. B. über das Menü „Streamen…“
navigator.presentation.defaultRequest = request;
request.addEventListener('connectionavailable', (event) => {
const connection = event.connection;
connection.addEventListener('connect', () => {
connection.send(JSON.stringify({ slide: 1 }));
});
});
}
Präsentation per Button starten (steuernde Seite)
const button = document.querySelector('#present');
button.addEventListener('click', async () => {
if (!navigator.presentation) return;
const request = new PresentationRequest(['/slides/receiver.html']);
try {
const connection = await request.start(); // benötigt eine Nutzeraktion
connection.addEventListener('message', (e) => console.log('Empfänger:', e.data));
connection.addEventListener('connect', () => connection.send('hallo'));
} catch (err) {
console.error('Start fehlgeschlagen:', err.name);
}
});
Nachrichten auf der Empfängerseite verarbeiten
// receiver.html – läuft auf dem zweiten Bildschirm
const receiver = navigator.presentation?.receiver;
if (receiver) {
const list = await receiver.connectionList;
const handle = (connection) => {
connection.addEventListener('message', (e) => {
console.log('Befehl:', e.data);
connection.send('bereit');
});
};
list.connections.forEach(handle);
list.addEventListener('connectionavailable', (e) => handle(e.connection));
}
// Wichtig · Fallstricke
- Experimentell und eingeschränkt verfügbar: Die API wird im Wesentlichen nur von Chromium-Browsern unterstützt (Chrome, Edge, Opera, auch auf Android). Firefox und Safari bieten sie nicht an. Prüfe deshalb vor jedem Zugriff mit
'presentation' in navigator. - Sicherer Kontext: Die Eigenschaft ist nur über HTTPS (oder auf
localhost) verfügbar. PresentationRequest.prototype.start()funktioniert nur nach einer Nutzeraktion (transiente Aktivierung), sonst wird das Promise mitInvalidAccessErrorabgelehnt. Bricht der Nutzer die Geräteauswahl ab, wird es mitNotAllowedErrorabgelehnt.- Über die Permissions-Policy
presentationlässt sich die API sperren. In iframes ist sie nur nutzbar, wenn das Elementallow="presentation"gesetzt hat. receiverist nur in einem vom Browser gestarteten Empfängerkontext gesetzt, sonst ist der Wertnull.- Sicherheit: Behandle Nachrichten, die über
PresentationConnectionankommen, als nicht vertrauenswürdig. Schreibe sie nicht ungeprüft ininnerHTML.