Signatur
Beschreibung
Der Konstruktor PictureInPictureEvent() legt ein neues Ereignisobjekt vom Typ PictureInPictureEvent an. Der Browser erzeugt solche Ereignisse normalerweise selbst: Er feuert enterpictureinpicture an einem <video>-Element, sobald es in den Bild-im-Bild-Modus wechselt, und leavepictureinpicture, wenn es den Modus verlässt.
Den Konstruktor ruft man selbst vor allem dann auf, wenn man solche Ereignisse synthetisch auslösen will, etwa in Unit-Tests, bei der Simulation von Zustandswechseln oder um eigene Komponenten über einen PiP-Wechsel zu informieren. Anders als beim allgemeinen Event-Konstruktor ist hier die Eigenschaft pictureInPictureWindow im Optionsobjekt Pflicht. Sie muss auf ein echtes PictureInPictureWindow-Objekt verweisen.
Ein PictureInPictureWindow kann man nicht selbst konstruieren. Man bekommt es nur als Ergebnis von HTMLVideoElement.prototype.requestPictureInPicture() oder aus einem echten PiP-Ereignis. Synthetische Ereignisse setzen also in der Praxis voraus, dass zuvor ein echtes PiP-Fenster geöffnet wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, beim Browser üblicherweise "enterpictureinpicture", "leavepictureinpicture" oder "resize". Eigene Namen sind erlaubt. |
|
| $options Pflicht | PictureInPictureEventInit | Objekt mit den Eigenschaften aus EventInit (bubbles, cancelable, composed, jeweils Standardwert false) und dem Pflichtfeld pictureInPictureWindow, einem PictureInPictureWindow. |
Rückgabewert
PictureInPictureEvent. Über seine Eigenschaft pictureInPictureWindow erreicht man das zugehörige PiP-Fenster.Beispiele
Echtes Ereignis abfangen und Fenstergröße auslesen
const video = document.querySelector('video');
video.addEventListener('enterpictureinpicture', (event) => {
const pipWindow = event.pictureInPictureWindow;
console.log(`PiP gestartet: ${pipWindow.width}x${pipWindow.height}`);
});
document.querySelector('#pip-button').addEventListener('click', async () => {
if (document.pictureInPictureEnabled) {
await video.requestPictureInPicture();
}
});
Synthetisches Ereignis mit echtem PiP-Fenster erzeugen
const video = document.querySelector('video');
const simulateEnter = async () => {
// Das PiP-Fenster lässt sich nur so erhalten (Nutzergeste nötig)
const pipWindow = await video.requestPictureInPicture();
const event = new PictureInPictureEvent('pip-status', {
pictureInPictureWindow: pipWindow,
bubbles: true
});
console.log(event.type, event.pictureInPictureWindow === pipWindow);
video.dispatchEvent(event);
};
document.addEventListener('pip-status', () => console.log('Status-Ereignis empfangen'));
document.querySelector('#pip-button').addEventListener('click', simulateEnter);
Fehlendes Pflichtfeld erzeugt TypeError
try {
new PictureInPictureEvent('enterpictureinpicture', {});
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Pflichtfeld: Wenn
pictureInPictureWindowfehlt oder kein echtesPictureInPictureWindowist, wirft der Konstruktor einenTypeError. - Ein
PictureInPictureWindowlässt sich nicht selbst erzeugen. In Tests ohne echtes Video muss man stattdessen ein einfachesEventoderCustomEventverwenden oder das Objekt nachbilden (mocken). - Synthetische Ereignisse haben
isTrusted === false. Außerdem lösen sie keine Aktion im Browser aus. Das Video wechselt dadurch also nicht in den PiP-Modus. - Für
requestPictureInPicture()braucht es eine Nutzergeste. Außerdem muss das Video Metadaten geladen haben und darf nicht das AttributdisablePictureInPicturetragen. - Kompatibilität: Unterstützt in Chromium-Browsern und Safari, nicht in Firefox. Firefox bietet zwar eine eigene PiP-Schaltfläche an, aber nicht diese API. Vorab prüfen mit
'PictureInPictureEvent' in windowbzw.document.pictureInPictureEnabled.