Start · Sprachen · JavaScript · Referenz · IntersectionObserverEntry.target

IntersectionObserverEntry.target

Eigenschaft

Schreibgeschützte Eigenschaft, die das beobachtete <code>Element</code> liefert, dessen Überschneidung mit der Wurzel (Root) sich geändert hat.

seit JavaScript Baseline: alle modernen Browser (seit 2019) Kategorie: webapi

Signatur

IntersectionObserverEntry.target

Beschreibung

Die Eigenschaft target eines IntersectionObserverEntry verweist auf genau das DOM-Element, für das der Eintrag erzeugt wurde. Ein einzelner IntersectionObserver kann beliebig viele Elemente über observe() beobachten. Der Callback bekommt dann ein Array von Einträgen, und erst über entry.target erfährt man, welches Element sich in den sichtbaren Bereich hinein- oder aus ihm herausbewegt hat.

Typische Einsatzfälle sind Lazy Loading von Bildern (das Ziel-Element bekommt sein src aus einem data-*-Attribut), Einblend-Animationen beim Scrollen (über eine CSS-Klasse am Ziel), Scrollspy-Navigationen (anhand der id des Ziels den passenden Menüpunkt markieren) und das Abmelden eines Elements mit observer.unobserve(entry.target), sobald es einmal sichtbar war.

Der Wert ist eine echte Referenz auf den DOM-Knoten und keine Kopie. Man kann also direkt Attribute, Klassen oder dataset lesen und ändern. Die Eigenschaft selbst ist schreibgeschützt: Wenn man ihr etwas zuweist, bleibt das ohne Wirkung.

Rückgabewert

Typ
Element
Beschreibung
Das beobachtete Element, dessen Überschneidungsstatus mit der Wurzel sich geändert hat. Es ist dasselbe Objekt, das an observe() übergeben wurde.

Beispiele

Lazy Loading von Bildern

// HTML: <img data-src="foto.jpg" alt="..." class="lazy">
const observer = new IntersectionObserver((entries, obs) => {
  entries.forEach((entry) => {
    if (!entry.isIntersecting) return;
    const img = entry.target;
    img.src = img.dataset.src;
    img.classList.remove('lazy');
    obs.unobserve(img); // nur einmal laden
    console.log('Geladen:', img.dataset.src);
  });
}, { rootMargin: '200px' });

document.querySelectorAll('img.lazy').forEach((img) => observer.observe(img));
Geladen: foto.jpg

Einblend-Animation beim Scrollen

const revealObserver = new IntersectionObserver((entries) => {
  for (const entry of entries) {
    // Klasse je nach Sichtbarkeit setzen oder entfernen
    entry.target.classList.toggle('sichtbar', entry.isIntersecting);
  }
}, { threshold: 0.25 });

document.querySelectorAll('.karte').forEach((el) => revealObserver.observe(el));

Scrollspy: aktiven Menüpunkt markieren

const links = new Map(
  [...document.querySelectorAll('nav a[href^="#"]')]
    .map((a) => [a.getAttribute('href').slice(1), a])
);

const spy = new IntersectionObserver((entries) => {
  entries
    .filter((e) => e.isIntersecting)
    .forEach((e) => {
      links.forEach((a) => a.classList.remove('aktiv'));
      links.get(e.target.id)?.classList.add('aktiv');
      console.log('Aktiver Abschnitt:', e.target.id);
    });
}, { rootMargin: '-50% 0px -50% 0px' });

document.querySelectorAll('section[id]').forEach((s) => spy.observe(s));
Aktiver Abschnitt: einleitung

// Wichtig · Fallstricke

  • Ziel nicht mit Wurzel verwechseln: target ist das beobachtete Element. Das Element, gegen das die Überschneidung gemessen wird, steht in observer.root; die Maße der Wurzel liefert entry.rootBounds.
  • Mehrere Einträge pro Element: In einem einzigen Callback-Aufruf können mehrere Einträge für dasselbe target stecken, zum Beispiel wenn es schnell hinein- und wieder herausgescrollt wurde. Entscheidend ist dann der letzte Eintrag.
  • Speicher: Solange ein Element beobachtet wird, hält der Observer eine Referenz darauf. Entfernte oder nicht mehr benötigte Elemente sollte man mit unobserve(entry.target) abmelden oder den Observer mit disconnect() beenden.
  • Erster Aufruf: Direkt nach observe() wird der Callback einmal für jedes Ziel aufgerufen, auch wenn es nicht sichtbar ist. Deshalb immer isIntersecting prüfen.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Internet Explorer kennt die Schnittstelle nicht; dort braucht man einen Polyfill.