Signatur
Beschreibung
Die Methode close() beendet die Kommunikationsverbindung zwischen der steuernden Seite (Controller) und der Präsentation auf einem zweiten Bildschirm, zum Beispiel einem Chromecast oder einem angeschlossenen Monitor. Der User Agent setzt den Zustand der Verbindung zunächst auf "closing" und schickt der Gegenseite eine leere closeMessage. Als closeReason wird dabei "closed" übermittelt. Danach wechselt state auf "closed", und auf beiden Seiten wird das Event close mit einem PresentationConnectionCloseEvent ausgelöst.
Wichtig ist der Unterschied zu terminate(): close() trennt nur diese eine Verbindung, die Präsentationsseite läuft auf dem Anzeigegerät weiter. Später kannst du dich über PresentationRequest.prototype.reconnect() mit der gespeicherten id wieder mit ihr verbinden. terminate() dagegen beendet die Präsentation vollständig.
close() passt zum Beispiel, wenn die steuernde Seite neu geladen oder verlassen wird, wenn der Nutzer auf „Trennen“ klickt oder wenn mehrere Controller dieselbe Präsentation nacheinander steuern sollen. Die Methode kannst du sowohl auf der Controller-Seite als auch auf der Empfängerseite (über navigator.presentation.receiver) aufrufen.
Rückgabewert
undefined). Das Schließen läuft asynchron ab. Ob es abgeschlossen ist, erkennst du am Event close bzw. an connection.state === "closed".Beispiele
Verbindung per Button trennen
const request = new PresentationRequest(['slides.html']);
let connection = null;
document.querySelector('#start').addEventListener('click', async () => {
connection = await request.start();
// ID merken, um später wieder verbinden zu können
localStorage.setItem('presentationId', connection.id);
connection.addEventListener('close', (event) => {
console.log(`Verbindung geschlossen: ${event.reason}`);
});
});
document.querySelector('#disconnect').addEventListener('click', () => {
// Nur schließen, wenn die Verbindung noch offen ist oder gerade aufgebaut wird
if (connection && ['connecting', 'connected'].includes(connection.state)) {
connection.close();
}
});
Beim Verlassen der Seite schließen und später wieder verbinden
const request = new PresentationRequest(['slides.html']);
let connection = null;
// Beim Laden: bestehende Präsentation wieder aufnehmen
const savedId = localStorage.getItem('presentationId');
if (savedId) {
try {
connection = await request.reconnect(savedId);
console.log('Wieder verbunden, Zustand:', connection.state);
} catch (err) {
console.warn('Reconnect fehlgeschlagen:', err.name);
localStorage.removeItem('presentationId');
}
}
// close() statt terminate(): Die Präsentation läuft weiter
window.addEventListener('pagehide', () => {
if (connection?.state === 'connected') {
connection.close();
}
});
Empfängerseite: Verbindung nach einer Abschlussnachricht schließen
// Läuft in der Präsentationsseite (slides.html)
const list = await navigator.presentation.receiver.connectionList;
const handle = (conn) => {
conn.addEventListener('message', (event) => {
if (event.data === 'bye') {
conn.send('Tschüss!');
conn.close();
}
});
conn.addEventListener('close', (e) => {
console.log('Controller getrennt:', e.reason, e.message);
});
};
list.connections.forEach(handle);
list.addEventListener('connectionavailable', (e) => handle(e.connection));
// Wichtig · Fallstricke
- Kompatibilität: Die Presentation API ist experimentell und wird praktisch nur von Chromium-basierten Browsern unterstützt, dort auch nur teilweise. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit
'PresentationRequest' in window. Außerdem ist ein sicherer Kontext (HTTPS) nötig. - Kein Effekt bei falschem Zustand: Ist
statebereits"closed"oder"terminated", bricht der Aufruf stillschweigend ab. Es wird kein Fehler geworfen und kein neuesclose-Event ausgelöst. close()ist nichtterminate(): Wer die Präsentation auf dem Zweitbildschirm wirklich beenden will, mussterminate()aufrufen. Nachclose()läuft sie weiter.- Nachrichten, die nach
close()mitsend()geschickt werden, lösen einenInvalidStateErroraus. Schicke Abschlussnachrichten also vor dem Schließen. - Das Event
closekommt asynchron. Außerdem wird es auch bei Verbindungsfehlern ausgelöst, dann mitreason === "error". Werte daher immerevent.reasonaus.