Signatur
Beschreibung
Der Konstruktor MediaQueryListEvent() erzeugt ein Ereignisobjekt vom Typ MediaQueryListEvent. Solche Ereignisse löst der Browser normalerweise selbst auf einem MediaQueryList-Objekt aus (Ereignistyp "change"), wenn eine mit window.matchMedia() überwachte Media Query ihren Zustand ändert, z. B. beim Wechsel in den Dunkelmodus oder wenn ein Breakpoint über- bzw. unterschritten wird.
Selbst aufrufen muss man den Konstruktor nur selten. Nützlich ist er vor allem in Unit-Tests, wenn man Handler für Media-Query-Änderungen prüfen will, ohne das Browserfenster zu verändern, und beim Weiterleiten oder Simulieren von Änderungen an eigene EventTarget-Objekte oder Komponenten.
Über das Optionsobjekt legt man die schreibgeschützten Eigenschaften media (die Media Query als String) und matches (ob sie aktuell zutrifft) fest. Dazu kommen die üblichen Optionen aus EventInit wie bubbles und cancelable. Ein von Hand erzeugtes Ereignis ändert nicht den echten Zustand der Media Query. Es ist nur ein Datenträger für Listener.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignistyps. Für Media-Query-Änderungen ist das in der Regel "change". |
|
| $options | object | {} | Optionales Initialisierungsobjekt (MediaQueryListEventInit, erweitert EventInit):
|
Rückgabewert
MediaQueryListEvent-Objekt mit den übergebenen Werten für type, media und matches.Beispiele
Ereignis erzeugen und Eigenschaften lesen
const event = new MediaQueryListEvent('change', {
media: '(prefers-color-scheme: dark)',
matches: true
});
console.log(event.type); // Ereignistyp
console.log(event.media); // Media Query
console.log(event.matches); // Trifft zu?
console.log(event instanceof Event);
Theme-Handler im Test mit simulierter Änderung prüfen
// Handler, der normalerweise an matchMedia hängt
const applyTheme = (e) => {
document.documentElement.dataset.theme = e.matches ? 'dark' : 'light';
};
const mql = window.matchMedia('(prefers-color-scheme: dark)');
mql.addEventListener('change', applyTheme);
// Test: Wechsel in den Dunkelmodus simulieren
applyTheme(new MediaQueryListEvent('change', {
media: mql.media,
matches: true
}));
console.log(document.documentElement.dataset.theme);
Breakpoint-Änderung an eigenes EventTarget weiterleiten
const layoutBus = new EventTarget();
layoutBus.addEventListener('change', (e) => {
console.log(`${e.media} → ${e.matches ? 'mobil' : 'desktop'}`);
});
const mobile = window.matchMedia('(max-width: 600px)');
// Echte Änderungen weiterreichen
mobile.addEventListener('change', (e) => {
layoutBus.dispatchEvent(new MediaQueryListEvent('change', {
media: e.media,
matches: e.matches
}));
});
// Anfangszustand einmalig melden
layoutBus.dispatchEvent(new MediaQueryListEvent('change', {
media: mobile.media,
matches: mobile.matches
}));
// Wichtig · Fallstricke
- Ein selbst erzeugtes Ereignis hat
isTrusted === falseund ändert nicht den Wert vonMediaQueryList.matches. Es informiert nur die Listener. - Ruft man
dispatchEvent()mit so einem Ereignis direkt auf einem echtenMediaQueryList-Objekt auf, werden dessen Listener ausgelöst.mql.matcheszeigt danach aber weiterhin den echten Zustand. Das kann Tests verwirren, die beides prüfen. - Der Wert von
mediawird nicht geprüft oder normalisiert. Beliebige Strings sind erlaubt. - Kompatibilität: In allen modernen Browsern verfügbar (Chrome/Edge 39+, Firefox 55+, Safari 14+). Ältere Safari-Versionen kennen den Konstruktor nicht. In Node.js und in Test-Umgebungen wie jsdom fehlt er je nach Version. Dort ggf. auf
new Event('change')mit zusätzlich gesetzten Eigenschaften ausweichen. - Das veraltete
MediaQueryList.addListener()bekommt dasselbe Ereignisobjekt. Besser istaddEventListener('change', …).