Signatur
Beschreibung
Der Konstruktor IntersectionObserverEntry() ist in der Intersection-Observer-Spezifikation beschrieben und soll aus einem Init-Objekt einen Eintrag erzeugen. Der Eintrag beschreibt, wie sich ein Zielelement zu einem bestimmten Zeitpunkt mit dem Root-Element (oder dem Viewport) überschneidet. Normalerweise legt man solche Objekte nie selbst an: Der Browser erzeugt sie und übergibt sie als Array an den Callback eines IntersectionObserver.
Einen eigenen Konstruktoraufruf bräuchte man höchstens für Unit-Tests, Polyfills oder Simulationen, also immer dann, wenn man Callback-Logik ohne echtes Scrollen und Layout prüfen will. In der Praxis werfen aktuelle Browser beim direkten Aufruf allerdings meist einen TypeError („Illegal constructor“). Für Tests nimmt man deshalb in der Regel einfache Objekte, die dieselbe Form haben (Duck Typing).
Die Felder des Init-Objekts entsprechen den schreibgeschützten Eigenschaften des Eintrags: time, rootBounds, boundingClientRect, intersectionRect, isIntersecting, intersectionRatio und target.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $intersectionObserverEntryInit Pflicht | Object | Init-Dictionary mit den folgenden Feldern:
|
Rückgabewert
IntersectionObserverEntry-Objekt mit den übergebenen Werten, sofern der Browser den Konstruktor unterstützt. Andernfalls wird ein TypeError geworfen.Beispiele
Konstruktor aufrufen und prüfen, ob er unterstützt wird
const target = document.createElement('div');
const init = {
time: performance.now(),
rootBounds: { x: 0, y: 0, width: 1024, height: 768 },
boundingClientRect: { x: 0, y: 700, width: 200, height: 100 },
intersectionRect: { x: 0, y: 700, width: 200, height: 68 },
isIntersecting: true,
intersectionRatio: 0.68,
target
};
try {
const entry = new IntersectionObserverEntry(init);
console.log(entry.isIntersecting, entry.intersectionRatio);
} catch (err) {
// In den meisten Browsern landet man hier
console.log(`Nicht unterstützt: ${err.name}`);
}
Test-Attrappe für Callback-Logik (Lazy Loading)
// Callback, die man testen möchte
const onIntersect = (entries, observer) => {
for (const entry of entries) {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
}
};
// Eintrag mit gleicher Form wie ein echter IntersectionObserverEntry
const createFakeEntry = (target, ratio) => ({
time: performance.now(),
rootBounds: new DOMRectReadOnly(0, 0, 1024, 768),
boundingClientRect: target.getBoundingClientRect(),
intersectionRect: new DOMRectReadOnly(0, 0, 100 * ratio, 100),
isIntersecting: ratio > 0,
intersectionRatio: ratio,
target
});
const img = document.createElement('img');
img.dataset.src = 'https://example.com/bild.jpg';
const fakeObserver = { unobserve: (el) => console.log('unobserve', el.tagName) };
onIntersect([createFakeEntry(img, 0.5)], fakeObserver);
console.log(img.src);
Der übliche Weg: Einträge vom Browser erhalten
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
console.log(entry instanceof IntersectionObserverEntry); // true
console.log(`${entry.target.id}: ${Math.round(entry.intersectionRatio * 100)} % sichtbar`);
});
}, { threshold: [0, 0.5, 1] });
observer.observe(document.querySelector('#footer'));
// Wichtig · Fallstricke
- Kaum nutzbar: Obwohl die Spezifikation den Konstruktor beschreibt, werfen Chrome, Firefox und Safari beim direkten Aufruf meist
TypeError: Illegal constructor. Den Aufruf daher immer mittry…catchabsichern oder ganz vermeiden. - Für Tests: Nimm einfache Objekte mit denselben Eigenschaften (siehe Beispiel). Beachte aber, dass eine solche Attrappe
instanceof IntersectionObserverEntrynicht besteht. Prüft dein Code auf den Typ, brauchst du einen Mock der Klasse, zum Beispiel in Jest oder jsdom, woIntersectionObserverohnehin fehlt. - Echte Einträge sind schreibgeschützt. Ihre Rechtecke sind
DOMRectReadOnly-Objekte, undrootBoundskann bei Iframes mit anderem Ursprungnullsein. timeist relativ zuperformance.timeOriginund kein Unix-Zeitstempel.