Start · Sprachen · JavaScript · Referenz · HTMLAnchorElement.relList

HTMLAnchorElement.relList

Eigenschaft

Liefert eine live <code>DOMTokenList</code> mit den Linktypen aus dem <code>rel</code>-Attribut eines <code>&lt;a&gt;</code>-Elements.

seit JavaScript Baseline: alle modernen Browser (seit 2016/2017) Kategorie: webapi

Signatur

get HTMLAnchorElement.relList

Beschreibung

Die schreibgeschützte Eigenschaft relList eines HTMLAnchorElement gibt eine live DOMTokenList zurück. Sie enthält die einzelnen Linktypen aus dem rel-Attribut, also die Beziehung zwischen dem aktuellen Dokument und dem Linkziel, z. B. noopener, noreferrer, nofollow oder external.

Im Gegensatz zur Eigenschaft rel, die nur den rohen Attribut-String liefert, lassen sich mit relList einzelne Werte gezielt prüfen, hinzufügen, entfernen oder umschalten, ohne dass man selbst Strings zerlegt und wieder zusammensetzt. Die Methoden entsprechen denen von classList: add(), remove(), toggle(), replace(), contains() und supports().

„Live“ heißt: Änderungen an der Liste schreiben sich sofort ins rel-Attribut zurück, und Änderungen am Attribut (z. B. über setAttribute('rel', …)) erscheinen sofort in der Liste. Die Eigenschaft selbst ist schreibgeschützt, eine Zuweisung von Strings wird aber in den meisten Browsern an rel weitergereicht ([PutForwards=value]).

Typische Anwendungsfälle sind das nachträgliche Absichern externer Links mit noopener noreferrer, das Markieren von Affiliate-Links mit sponsored oder das Auswerten von Linktypen für eigene Navigationslogik.

Rückgabewert

Typ
DOMTokenList
Beschreibung
Eine live DOMTokenList mit den durch Leerzeichen getrennten Linktypen des rel-Attributs. Ist kein rel gesetzt, ist die Liste leer (length === 0).

Beispiele

Linktypen auslesen und prüfen

// <a id="doku" href="https://example.com" rel="noopener external">Doku</a>
const link = document.getElementById('doku');

console.log(link.relList.length);
console.log([...link.relList]);
console.log(link.relList.contains('noopener'));
console.log(link.relList.contains('nofollow'));
2 ["noopener", "external"] true false

Alle externen Links absichern

const sichereExterneLinks = () => {
  const links = document.querySelectorAll('a[href]');
  for (const a of links) {
    // Nur Links auf fremde Hosts
    if (a.host && a.host !== location.host) {
      a.relList.add('noopener', 'noreferrer');
      if (!a.target) a.target = '_blank';
    }
  }
};

sichereExterneLinks();
console.log(document.querySelector('a[target="_blank"]')?.rel);
noopener noreferrer

Linktypen umschalten, ersetzen und entfernen

const a = document.createElement('a');
a.href = 'https://shop.example.com/produkt';
a.rel = 'nofollow';

a.relList.replace('nofollow', 'sponsored');
a.relList.toggle('noopener');   // hinzufügen
console.log(a.rel);

a.relList.toggle('noopener');   // wieder entfernen
a.relList.remove('sponsored');
console.log(a.rel === '', a.relList.length);
sponsored noopener true 0

Live-Verhalten zwischen Attribut und Liste

const a = document.createElement('a');
const liste = a.relList; // Referenz einmal holen

a.setAttribute('rel', 'prev help');
console.log(liste.length, liste.value);

liste.add('author');
console.log(a.getAttribute('rel'));
2 prev help prev help author

// Wichtig · Fallstricke

  • Schreibgeschützt: relList kann nicht durch ein anderes Objekt ersetzt werden. a.relList = 'noopener' wird an rel weitergeleitet – für klaren Code besser direkt a.rel setzen.
  • supports() ist bei <a> nicht aussagekräftig: Für Anker gibt es keine definierte Menge unterstützter Tokens, a.relList.supports('noopener') wirft einen TypeError. Zur Feature-Erkennung (z. B. preload) eignet sich document.createElement('link').relList.supports(...).
  • Groß-/Kleinschreibung: contains() vergleicht exakt. rel=\"NoOpener\" wirkt im Browser zwar als noopener, contains('noopener') liefert jedoch false.
  • Tokens mit Leerzeichen oder leere Strings führen bei add()/remove() zu InvalidCharacterError bzw. SyntaxError.
  • Sicherheit: Moderne Browser setzen bei target=\"_blank\" implizit noopener. Für ältere Browser und zum Schutz vor Referrer-Leaks sollte man noopener noreferrer trotzdem explizit ergänzen (Schutz vor „Reverse Tabnabbing“).
  • Kompatibilität: In allen aktuellen Browsern verfügbar; Internet Explorer unterstützt relList an <a> nicht – dort als Ausweichlösung das rel-Attribut als String bearbeiten.