Signatur
Beschreibung
Das Ereignis currentscreenchange gehört zur Window Management API (früher „Multi-Screen Window Placement“). Es wird auf dem ScreenDetails-Objekt ausgelöst, das man über window.getScreenDetails() erhält, sobald sich ScreenDetails.currentScreen ändert. Das passiert in zwei Fällen:
- Das Browserfenster wird auf einen anderen Bildschirm verschoben, und
currentScreenzeigt danach auf ein anderesScreenDetailed-Objekt. - Eine oder mehrere Eigenschaften des aktuellen Bildschirms ändern sich, z. B.
width,height,availWidth,availHeight,colorDepth,orientation,left,top,availLeft,availTop,devicePixelRatio,label,isPrimaryoderisInternal.
Typische Einsatzfälle sind Präsentations-, Trading- oder Dashboard-Anwendungen, die ihr Layout, die Auflösung von Canvas-Grafiken oder die Platzierung weiterer Fenster anpassen, sobald der Nutzer das Fenster auf einen anderen Monitor zieht oder sich Skalierung bzw. Auflösung ändern.
Das Ereignis ist ein einfaches Event ohne zusätzliche Eigenschaften. Die neuen Werte liest man direkt aus screenDetails.currentScreen ab. Registrieren lässt sich der Handler per addEventListener("currentscreenchange", …) oder über die Eigenschaft screenDetails.oncurrentscreenchange.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "currentscreenchange". |
|
| $handler Pflicht | (event: Event) => void | Callback, der bei jeder Änderung von currentScreen aufgerufen wird. Er bekommt ein einfaches Event, dessen target das ScreenDetails-Objekt ist. |
|
| $options | boolean | AddEventListenerOptions | false | Übliche Listener-Optionen wie once oder signal (zum Entfernen per AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein Event-Objekt; die aktuellen Bildschirmdaten stehen in screenDetails.currentScreen (ScreenDetailed).Beispiele
Monitorwechsel mit addEventListener erkennen
const initScreenWatcher = async () => {
if (!('getScreenDetails' in window)) {
console.warn('Window Management API wird nicht unterstützt');
return;
}
// Fragt beim ersten Aufruf nach der Berechtigung "window-management"
const screenDetails = await window.getScreenDetails();
let lastLabel = screenDetails.currentScreen.label;
screenDetails.addEventListener('currentscreenchange', () => {
const s = screenDetails.currentScreen;
if (s.label !== lastLabel) {
console.log(`Fenster auf "${s.label}" verschoben`);
lastLabel = s.label;
}
console.log(`Auflösung: ${s.width}x${s.height}, DPR: ${s.devicePixelRatio}`);
});
};
document.querySelector('#start').addEventListener('click', initScreenWatcher);
Canvas-Auflösung per on-Property anpassen
const canvas = document.querySelector('canvas');
const resizeCanvas = (dpr) => {
const { clientWidth, clientHeight } = canvas;
canvas.width = Math.round(clientWidth * dpr);
canvas.height = Math.round(clientHeight * dpr);
console.log(`Canvas neu skaliert für DPR ${dpr}`);
};
const screenDetails = await window.getScreenDetails();
resizeCanvas(screenDetails.currentScreen.devicePixelRatio);
// Alternative zu addEventListener: nur ein Handler möglich
screenDetails.oncurrentscreenchange = () => {
resizeCanvas(screenDetails.currentScreen.devicePixelRatio);
};
Listener wieder entfernen (removeEventListener und AbortController)
const screenDetails = await window.getScreenDetails();
const onScreenChange = () => {
console.log('Aktueller Bildschirm:', screenDetails.currentScreen.label);
};
screenDetails.addEventListener('currentscreenchange', onScreenChange);
// Später, z. B. beim Verlassen der Ansicht:
screenDetails.removeEventListener('currentscreenchange', onScreenChange);
// Oder mehrere Listener gesammelt per AbortController entfernen
const controller = new AbortController();
screenDetails.addEventListener('currentscreenchange', onScreenChange, {
signal: controller.signal
});
controller.abort(); // entfernt den Listener
// Wichtig · Fallstricke
- Browser-Unterstützung: Nur in Chromium-basierten Browsern (ab Version 100). Firefox und Safari unterstützen die Window Management API nicht – immer per
'getScreenDetails' in windowprüfen. - Berechtigung:
window.getScreenDetails()braucht die Berechtigung"window-management"(früher"window-placement") und einen sicheren Kontext (HTTPS). Der erste Aufruf sollte durch eine Nutzeraktion ausgelöst werden, damit die Berechtigungsabfrage erscheint. In iframes muss die Permissions-Policywindow-managementerlaubt sein. - Das Ereignis wird nicht auf
window.screenausgelöst, sondern nur auf demScreenDetails-Objekt. Für Änderungen an der Menge angeschlossener Bildschirme gibt es das separate Ereignisscreenschange, für Änderungen an einem einzelnen Bildschirm daschange-Ereignis aufScreen/ScreenDetailed. - Das Ereignis kann bei schrittweisem Verschieben oder Skalieren mehrfach kurz hintereinander feuern. Aufwendige Neuberechnungen deshalb entprellen (Debounce) oder mit
requestAnimationFramebündeln. - Das
Event-Objekt enthält keine Detaildaten. Welche Eigenschaft sich geändert hat, muss man selbst durch Vergleich mit gespeicherten Werten ermitteln.