Signatur
Beschreibung
Mit terminate() beendet die steuernde Seite (Controller) oder die präsentierende Seite (Receiver) eine Präsentation der Presentation API vollständig. Der User-Agent schließt dann den Browsing-Kontext auf dem Zweitbildschirm, also etwa auf dem Chromecast, dem Beamer oder dem angeschlossenen Monitor. Danach setzt er den state jeder zugehörigen PresentationConnection auf "terminated" und löst auf jeder das Ereignis terminate aus.
Wichtig ist der Unterschied zu close(). close() trennt nur die Verbindung, die Präsentation läuft auf dem Zweitbildschirm weiter. Später kann man sich mit PresentationRequest.reconnect() wieder verbinden. terminate() dagegen ist endgültig: Eine beendete Präsentation lässt sich nicht wiederherstellen, man muss mit PresentationRequest.start() eine neue starten.
Typische Einsätze sind ein Button „Präsentation beenden“ in einer Folien- oder Medien-App, das Aufräumen, wenn der Nutzer die Sitzung abmeldet, oder das Selbstbeenden einer Receiver-Seite, wenn der Inhalt zu Ende ist.
Die Methode wirkt nur, wenn die Verbindung im Zustand "connected" oder "connecting" ist. In allen anderen Zuständen passiert nichts.
Beispiele
Präsentation starten und per Button beenden
const request = new PresentationRequest(['/slides/receiver.html']);
let connection = null;
document.querySelector('#start').addEventListener('click', async () => {
try {
connection = await request.start();
console.log('Präsentation läuft, ID:', connection.id);
} catch (err) {
console.error('Start fehlgeschlagen:', err.name);
}
});
document.querySelector('#stop').addEventListener('click', () => {
// Nur beenden, wenn die Verbindung aktiv ist
if (connection && ['connected', 'connecting'].includes(connection.state)) {
connection.terminate();
}
});
Auf das terminate-Ereignis reagieren und aufräumen
const setupConnection = (connection) => {
connection.addEventListener('message', (e) => console.log('Empfangen:', e.data));
connection.addEventListener('terminate', () => {
console.log('Präsentation beendet, Zustand:', connection.state);
localStorage.removeItem('presentationId');
document.querySelector('#stop').disabled = true;
});
// Alternativ über die on-Property:
// connection.onterminate = () => { ... };
};
const request = new PresentationRequest(['/slides/receiver.html']);
const connection = await request.start();
setupConnection(connection);
localStorage.setItem('presentationId', connection.id);
// Später: endgültig beenden
connection.terminate();
close() und terminate() im Vergleich
const request = new PresentationRequest(['/player/receiver.html']);
const connection = await request.start();
// Variante A: nur trennen, die Präsentation läuft weiter
connection.close();
const again = await request.reconnect(connection.id);
console.log('Wieder verbunden:', again.state);
// Variante B: endgültig beenden, reconnect() schlägt danach fehl
again.terminate();
try {
await request.reconnect(again.id);
} catch (err) {
console.log('Reconnect nicht möglich:', err.name);
}
Receiver-Seite beendet sich selbst
// Läuft in der Seite auf dem Zweitbildschirm (receiver.html)
const list = await navigator.presentation.receiver.connectionList;
const video = document.querySelector('video');
video.addEventListener('ended', () => {
// Eine Verbindung genügt, der User-Agent beendet die gesamte Präsentation
list.connections[0]?.terminate();
});
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die Presentation API ist experimentell. Sie wird nur von Chromium-Browsern unterstützt, Firefox und Safari kennen sie nicht. Vorher per Feature-Erkennung prüfen, z. B.
'PresentationRequest' in window. - Sicherer Kontext: Die API steht nur über HTTPS (oder
localhost) zur Verfügung. - Endgültig: Nach
terminate()ist die Präsentation weg,reconnect()mit derselben ID schlägt fehl. Wer die Präsentation später fortsetzen will, nutztclose(). - Kein Fehler, kein Promise: Ist die Verbindung bereits
"closed"oder"terminated", bleibt der Aufruf ohne Wirkung. Es wird kein Fehler ausgelöst. Den Abschluss erkennt man nur über das Ereignisterminate. - Mehrere Controller: Das Ereignis
terminateerreicht alle verbundenen Controller, auch andere Tabs oder Geräte. Deren Oberflächen sollten also darauf reagieren und z. B. gespeicherte Präsentations-IDs entfernen. - Beim Aufruf auf der Receiver-Seite schließt der User-Agent den Browsing-Kontext des Receivers. Code nach dem Aufruf läuft unter Umständen nicht mehr vollständig.