Start · Sprachen · JavaScript · Referenz · DocumentFragment.querySelector()

DocumentFragment.querySelector()

Methode

Gibt das erste Element im <code>DocumentFragment</code> zurück, das den angegebenen CSS-Selektoren entspricht, oder <code>null</code>, wenn keines passt.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

DocumentFragment.prototype.querySelector(selectors)

Beschreibung

querySelector() durchsucht alle Nachfahren eines DocumentFragment in Dokumentreihenfolge (Tiefensuche, Pre-Order) und liefert das erste Element, das zur übergebenen Selektorliste passt. Die Methode stammt aus dem Mixin ParentNode und verhält sich genauso wie Document.querySelector() oder Element.querySelector().

Besonders praktisch ist sie bei Templates (template.content ist ein DocumentFragment) und bei Shadow DOM (ShadowRoot erbt von DocumentFragment). So kann man geklonte Template-Inhalte vor dem Einfügen ins Dokument befüllen – das ist schneller, weil das Live-DOM erst einmal geändert wird.

Zu beachten: Ein Fragment ist kein Element und kann deshalb selbst nicht getroffen werden – durchsucht werden nur seine Nachfahren. Nachdem das Fragment per append() ins Dokument eingefügt wurde, ist es leer. Weitere Abfragen darauf liefern dann null.

Parameter

Name Typ Default Beschreibung
$selectors Pflicht string Ein gültiger CSS-Selektor oder eine kommagetrennte Selektorliste, z. B. '.item', '#titel' oder 'li:first-child, p.hinweis'.

Rückgabewert

Typ
Element | null
Beschreibung
Das erste passende Element in Dokumentreihenfolge oder null, wenn kein Nachfahre passt.

Beispiele

Element in einem selbst gebauten Fragment finden

const fragment = document.createDocumentFragment();

['Äpfel', 'Birnen', 'Kirschen'].forEach((obst, i) => {
  const li = document.createElement('li');
  li.textContent = obst;
  if (i === 1) li.classList.add('aktiv');
  fragment.append(li);
});

const aktiv = fragment.querySelector('li.aktiv');
console.log(aktiv.textContent);
console.log(fragment.querySelector('.fehlt'));
Birnen null

Template-Inhalt vor dem Einfügen befüllen

// HTML: <template id="karte"><article><h2 class="titel"></h2><p class="text"></p></article></template>
const template = document.querySelector('#karte');

const renderKarte = ({ titel, text }) => {
  const klon = template.content.cloneNode(true); // DocumentFragment
  klon.querySelector('.titel').textContent = titel;
  klon.querySelector('.text').textContent = text;
  return klon;
};

document.body.append(renderKarte({ titel: 'Hallo', text: 'Aus dem Template.' }));
console.log(document.querySelector('article .titel').textContent);
Hallo

Abfrage im Shadow DOM (ShadowRoot ist ein DocumentFragment)

class ZaehlerButton extends HTMLElement {
  #count = 0;
  constructor() {
    super();
    const root = this.attachShadow({ mode: 'open' });
    root.innerHTML = '<button type="button">Klicks: <span class="wert">0</span></button>';
    root.querySelector('button').addEventListener('click', () => {
      root.querySelector('.wert').textContent = ++this.#count;
    });
  }
}
customElements.define('zaehler-button', ZaehlerButton);

const el = document.createElement('zaehler-button');
document.body.append(el);
console.log(el.shadowRoot instanceof DocumentFragment);
true

Fallstrick: Fragment nach dem Einfügen leer

const frag = document.createDocumentFragment();
const p = document.createElement('p');
p.className = 'info';
frag.append(p);

console.log(frag.querySelector('.info') === p);
document.body.append(frag); // Kinder werden verschoben
console.log(frag.querySelector('.info'));
console.log(document.body.querySelector('.info') === p);
true null true

// Wichtig · Fallstricke

  • Ungültige Selektoren wie 'div[' lösen eine SyntaxError-DOMException aus. Dynamische Werte (z. B. IDs, die mit einer Ziffer beginnen) sollte man mit CSS.escape() absichern.
  • Leeres Fragment nach dem Einfügen: append()/appendChild() verschiebt die Kinder ins Dokument. Referenzen daher vorher holen.
  • Das Fragment selbst wird nie gefunden, nur seine Nachfahren. Selektoren wie :scope > li beziehen sich auf die Wurzel des Fragments und funktionieren in modernen Browsern.
  • Im Shadow DOM findet shadowRoot.querySelector() nur Elemente im Schattenbaum, nicht die per <slot> projizierten Light-DOM-Kinder. Umgekehrt dringt document.querySelector() nicht in Shadow Roots ein.
  • Wenn man nur eine ID sucht, ist DocumentFragment.getElementById() etwas schneller.
  • Kompatibilität: wird von allen modernen Browsern unterstützt (IE ab Version 9).