Signatur
Beschreibung
Mit deleteMedium() entfernen Sie per CSSOM eine einzelne Medienabfrage aus einer MediaList. Solche Listen finden Sie unter anderem in CSSStyleSheet.media (entspricht dem media-Attribut von <style> bzw. <link>), in CSSMediaRule.media (die Bedingung einer @media-Regel) und in CSSImportRule.media.
Die Methode passt die Bedingungen eines Stylesheets zur Laufzeit an, ohne dass Sie die Zeichenkette mediaText selbst zerlegen und wieder zusammensetzen müssen. Ein typischer Fall ist ein Stylesheet mit media="screen, print", das künftig nur noch am Bildschirm gelten soll.
Das Argument wird als Medienabfrage eingelesen und mit den vorhandenen Einträgen in ihrer normalisierten (serialisierten) Form verglichen. Alle passenden Einträge werden entfernt. Gibt es keinen passenden Eintrag, löst die Methode eine DOMException vom Typ NotFoundError aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $oldMedium Pflicht | string | Die Medienabfrage, die entfernt werden soll, z. B. "print" oder "(max-width: 600px)". Sie wird vor dem Vergleich normalisiert. |
Beispiele
„print“ aus dem media-Attribut eines Stylesheets entfernen
// <style id="theme" media="screen, print">body { color: navy; }</style>
const sheet = document.getElementById('theme').sheet;
console.log(sheet.media.mediaText);
sheet.media.deleteMedium('print');
console.log(sheet.media.mediaText);
console.log(sheet.media.length);
Medienabfrage in einem konstruierten Stylesheet ändern
const sheet = new CSSStyleSheet({ media: 'screen, (prefers-color-scheme: dark)' });
sheet.replaceSync('body { background: #111; color: #eee; }');
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
// Stylesheet soll nur noch vom Farbschema abhängen
sheet.media.deleteMedium('screen');
console.log(sheet.media.mediaText);
Sicher entfernen, ohne dass ein NotFoundError auftritt
const removeMedium = (mediaList, medium) => {
try {
mediaList.deleteMedium(medium);
return true;
} catch (err) {
if (err.name === 'NotFoundError') return false;
throw err;
}
};
// Erste @media-Regel im ersten Stylesheet suchen
const rule = [...document.styleSheets[0].cssRules]
.find((r) => r instanceof CSSMediaRule);
if (rule) {
console.log(removeMedium(rule.media, 'print')); // vorhanden
console.log(removeMedium(rule.media, 'projection')); // nicht vorhanden
}
// Wichtig · Fallstricke
- NotFoundError: Ist die Medienabfrage nicht in der Liste enthalten, wirft die Methode eine
DOMException(NotFoundError). Prüfen Sie vorher mit einer Schleife über die Liste bzw. mitmediaList.item(i), oder fangen Sie den Fehler mittry/catchab. - Vergleich in normalisierter Form: Verglichen wird die serialisierte Schreibweise, nicht der Originaltext. So wird
"(MAX-WIDTH:600px)"in der Regel als"(max-width: 600px)"erkannt. Bei ungewöhnlichen oder ungültigen Schreibweisen kann sich das Ergebnis je nach Browser unterscheiden. - Leere Liste: Wenn Sie den letzten Eintrag entfernen, ist die Liste leer. Eine leere
MediaListbedeutet „alle Medien“: Das Stylesheet oder die Regel gilt danach also immer und nicht etwa nie. - Soll die gesamte Liste ersetzt werden, ist es einfacher,
mediaList.mediaTextdirekt zu setzen. - Bei Stylesheets von fremden Ursprüngen (Cross-Origin ohne CORS) können Sie wegen der Sicherheitsbeschränkungen nicht auf
cssRuleszugreifen, sodass Sie die Medienlisten von@media-Regeln dort nicht ändern können. - Die Methode wird von allen modernen Browsern unterstützt. Ältere Implementierungen haben bei fehlenden Einträgen teils anders reagiert.