Signatur
Beschreibung
Das Interface HTMLLinkElement steht für das HTML-Element <link>. Es beschreibt die Beziehung zwischen dem aktuellen Dokument und einer externen Ressource, etwa einem Stylesheet (rel="stylesheet"), einem Favicon (rel="icon"), einer kanonischen URL (rel="canonical") oder einem Ressourcen-Hinweis wie preload, prefetch und preconnect. Nicht zu verwechseln ist es mit HTMLAnchorElement (<a>), das anklickbare Hyperlinks im Seiteninhalt darstellt.
Zu den wichtigsten Eigenschaften gehören:
href: URL der verknüpften Ressourcerel/relList: Art der Beziehung, als String bzw.DOMTokenListas: Ressourcentyp beipreload(z. B."style","script","font")media: Media Query, für die die Ressource gilttype,hreflang,crossOrigin,integrity,referrerPolicy,fetchPrioritydisabled: deaktiviert ein Stylesheetsheet: das zugehörigeCSSStyleSheet, sobald ein Stylesheet geladen ist (sonstnull)sizes:DOMTokenListmit Icon-Größen
Typische Einsatzfälle sind das dynamische Nachladen von CSS (z. B. für Themes), das Austauschen des Favicons zur Laufzeit und gezielte Performance-Optimierung mit Preload-Hinweisen. Das Element löst die Ereignisse load und error aus. So lässt sich feststellen, ob eine Ressource erfolgreich geladen wurde.
Rückgabewert
document.createElement("link") oder durch Abfragen vorhandener Elemente, z. B. mit document.querySelector("link[rel=stylesheet]").Beispiele
Stylesheet dynamisch laden (mit Promise)
const loadStylesheet = (url) => new Promise((resolve, reject) => {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = url;
link.addEventListener('load', () => resolve(link));
link.addEventListener('error', () => reject(new Error(`CSS konnte nicht geladen werden: ${url}`)));
document.head.append(link);
});
try {
const link = await loadStylesheet('/css/dark-theme.css');
console.log('Geladen, Regeln:', link.sheet.cssRules.length);
} catch (err) {
console.error(err.message);
}
Favicon zur Laufzeit austauschen
const setFavicon = (url) => {
let icon = document.querySelector('link[rel~="icon"]');
if (!icon) {
icon = document.createElement('link');
icon.rel = 'icon';
document.head.append(icon);
}
icon.href = url;
};
// z. B. bei ungelesenen Nachrichten
setFavicon('/img/favicon-notification.png');
Schrift per Preload vorladen
const preload = document.createElement('link');
preload.rel = 'preload';
preload.as = 'font';
preload.type = 'font/woff2';
preload.href = '/fonts/inter.woff2';
preload.crossOrigin = 'anonymous'; // bei Schriften Pflicht
document.head.append(preload);
console.log(preload.relList.supports('preload'));
Theme-Stylesheet ein- und ausschalten
const darkTheme = document.querySelector('link#dark-theme');
document.querySelector('#toggle').addEventListener('click', () => {
darkTheme.disabled = !darkTheme.disabled;
console.log('Dark-Theme aktiv:', !darkTheme.disabled);
});
// Wichtig · Fallstricke
sheetund CORS: Ein Zugriff auflink.sheet.cssRulesbei Stylesheets von fremden Ursprüngen wirft einenSecurityError, wenn sie nicht mitcrossOriginund passenden CORS-Headern geladen wurden.- Kein
load-Ereignis bei jedemrel: Obload/errorausgelöst werden, hängt vom Browser und vomrel-Wert ab (beiiconodercanonicaletwa nicht zuverlässig). Registriere Listener vor dem Einfügen in das DOM. - Preload: Ohne gültiges
aswird die Ressource ignoriert oder doppelt geladen. Bei Schriften istcrossOriginnötig, auch wenn sie vom selben Ursprung kommen. Ungenutzte Preloads erzeugen Konsolenwarnungen. - Sicherheit: Für CDN-Ressourcen empfiehlt sich
integrity(Subresource Integrity). Dynamisch gesetztehref-Werte unterliegen der Content Security Policy (style-src,font-srcusw.). Nicht vertrauenswürdige URLs solltest du nie ungeprüft übernehmen, da fremdes CSS Daten abgreifen kann (CSS-Injection). disabledfunktioniert nur zuverlässig bei Stylesheets. Das HTML-Attributdisabledist erst seit einigen Jahren in allen gängigen Browsern einheitlich umgesetzt.fetchPriorityundblockingsind neuere Eigenschaften und werden nicht in allen Browsern unterstützt. Prüfe die Unterstützung vorher, z. B. mit'fetchPriority' in HTMLLinkElement.prototype.