Start · Sprachen · JavaScript · Referenz · CSSImportRule.href

CSSImportRule.href

Eigenschaft

Gibt die URL als schreibgeschützten String zurück, die in einer <code>@import</code>-Regel angegeben ist, und zwar genau so, wie sie im CSS-Quelltext steht.

seit JavaScript Baseline: alle Browser (CSSOM) Kategorie: webapi

Signatur

CSSImportRule.href

Beschreibung

Die Eigenschaft href der Schnittstelle CSSImportRule liefert die URL, die in einer @import-Regel steht. Dabei spielt es keine Rolle, ob sie als @import url("a.css"); oder als @import "a.css"; geschrieben wurde. Die Eigenschaft ist schreibgeschützt. Wer eine andere URL braucht, muss die Regel löschen (deleteRule()) und neu einfügen (insertRule()).

Wichtig: href gibt die URL so zurück, wie sie im Quelltext steht. Relative Pfade wie "themes/dark.css" bleiben also relativ. Die aufgelöste, absolute URL steht in rule.styleSheet.href, also in der Eigenschaft des importierten CSSStyleSheet-Objekts.

Typische Einsatzfälle sind Werkzeuge zum Prüfen von Stylesheets, Debugging-Hilfen und Code, der das Nachladen von Themes steuert. Solcher Code geht die Regeln in document.styleSheets durch und sucht darin gezielt nach @import-Abhängigkeiten.

Rückgabewert

Typ
string
Beschreibung
Die in der @import-Regel angegebene URL als String, ohne url() und ohne Anführungszeichen, in der Schreibweise des Quelltexts (nicht aufgelöst).

Beispiele

URL einer @import-Regel auslesen

const style = document.createElement('style');
style.textContent = `
  @import url("themes/dark.css") screen;
  body { margin: 0; }
`;
document.head.append(style);

const rule = style.sheet.cssRules[0];
console.log(rule instanceof CSSImportRule); // true
console.log(rule.href);
true themes/dark.css

Alle @import-Abhängigkeiten der Seite auflisten

const findImports = () => {
  const imports = [];
  for (const sheet of document.styleSheets) {
    let rules;
    try {
      rules = sheet.cssRules; // kann bei fremden Ursprüngen fehlschlagen
    } catch (err) {
      console.warn('Kein Zugriff auf', sheet.href, err.name);
      continue;
    }
    for (const rule of rules) {
      if (rule instanceof CSSImportRule) {
        imports.push({ quelle: sheet.href ?? '(inline)', import: rule.href });
      }
    }
  }
  return imports;
};

console.table(findImports());
Tabelle mit Spalten „quelle“ und „import“, z. B. (inline) | themes/dark.css

Rohe URL vs. aufgelöste URL vergleichen

const style = document.createElement('style');
style.textContent = '@import "../css/print.css" print;';
document.head.append(style);

const rule = style.sheet.cssRules[0];
console.log('Quelltext:', rule.href);
console.log('Aufgelöst:', rule.styleSheet?.href);
console.log('Medien:', rule.media.mediaText);
Quelltext: ../css/print.css Aufgelöst: https://example.com/css/print.css (abhängig von der Dokument-URL) Medien: print

// Wichtig · Fallstricke

  • Nicht aufgelöst: href enthält die URL so, wie sie im Quelltext steht. Für die absolute URL nimmt man rule.styleSheet?.href oder löst sie selbst auf, z. B. mit new URL(rule.href, sheet.href ?? document.baseURI).
  • Schreibgeschützt: Eine Zuweisung an href wird stillschweigend ignoriert, im Strict Mode wirft sie einen TypeError. Zum Ändern die Regel mit deleteRule() entfernen und mit insertRule() neu einfügen. @import muss dabei vor allen anderen Regeln stehen (Ausnahme: @charset und @layer-Anweisungen), sonst gibt es einen HierarchyRequestError.
  • Fremde Ursprünge (CORS): Der Zugriff auf cssRules eines Stylesheets von einer anderen Domain ohne passende CORS-Header wirft einen SecurityError. Deshalb den Zugriff immer mit try/catch absichern.
  • Konstruierte Stylesheets: In Stylesheets, die mit new CSSStyleSheet() erzeugt wurden, sind @import-Regeln nicht erlaubt. replace() und replaceSync() ignorieren sie, dort gibt es also keine CSSImportRule.
  • Die Eigenschaft wird von allen modernen Browsern seit Langem unterstützt.