Dokument: querySelectorAll() Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die Document-Methode querySelectorAll() gibt eine statische (nicht live) NodeList zurück, die eine Liste der Elemente des Dokuments darstellt, die mit der angegebenen Gruppe von Selektoren übereinstimmen.

Syntax

js
querySelectorAll(selectors)

Parameter

selectors

Ein String, der einen oder mehrere Selektoren enthält, die übereinstimmen sollen. Dieser String muss ein gültiger CSS-Selektor-String sein; ist er es nicht, wird eine SyntaxError-Ausnahme ausgelöst.

Beachten Sie, dass die HTML-Spezifikation nicht erfordert, dass Attributwerte gültige CSS-Bezeichner sind. Wenn ein class- oder id-Attributwert kein gültiger CSS-Bezeichner ist, müssen Sie ihn vor der Verwendung in einem Selektor escapen, entweder indem Sie CSS.escape() auf den Wert anwenden oder eine der Techniken verwenden, die in Zeichen escapen beschrieben sind. Siehe Attributwerte escapen für ein Beispiel.

Rückgabewert

Eine nicht-live NodeList, die für jedes Element, das mit mindestens einem der angegebenen Selektoren übereinstimmt, ein Element-Objekt enthält, oder eine leere NodeList, falls keine Übereinstimmungen gefunden werden. Die Elemente sind in Dokumentreihenfolge — das heißt, Eltern vor Kindern, frühere Geschwister vor späteren Geschwistern.

Hinweis: Wenn die angegebenen selectors ein CSS-Pseudoelement enthalten, ist die zurückgegebene Liste immer leer.

Ausnahmen

SyntaxError DOMException

Wird ausgelöst, wenn die Syntax des angegebenen selectors-Strings nicht gültig ist.

Beispiele

Eine Liste von Übereinstimmungen abrufen

Um eine NodeList aller <p>-Elemente im Dokument zu erhalten:

js
const matches = document.querySelectorAll("p");

Dieses Beispiel gibt eine Liste aller <div>-Elemente im Dokument zurück, die eine Klasse von entweder note oder alert haben:

js
const matches = document.querySelectorAll("div.note, div.alert");

Hier erhalten wir eine Liste von <p>-Elementen, deren direktes Elternelement ein <div> mit der Klasse highlighted ist, und die sich innerhalb eines Containers mit der ID test befinden.

js
const container = document.querySelector("#test");
const matches = container.querySelectorAll("div.highlighted > p");

Dieses Beispiel verwendet einen Attributselektor, um eine Liste der <iframe>-Elemente im Dokument zu erhalten, die ein Attribut namens data-src enthalten:

js
const matches = document.querySelectorAll("iframe[data-src]");

Hier wird ein Attributselektor verwendet, um eine Liste der Listenelemente abzurufen, die innerhalb einer Liste mit der ID user-list enthalten sind und ein data-active-Attribut mit dem Wert 1 haben:

js
const container = document.querySelector("#user-list");
const matches = container.querySelectorAll("li[data-active='1']");

Zugriff auf die Übereinstimmungen

Sobald die NodeList der übereinstimmenden Elemente zurückgegeben wurde, können Sie sie wie jedes Array untersuchen. Ist das Array leer (d. h. seine length-Eigenschaft ist 0), wurden keine Übereinstimmungen gefunden.

Andernfalls können Sie mit der Standard-Array-Notation auf die Inhalte der Liste zugreifen. Sie können jede gängige Schleifenanweisung verwenden, wie z. B.:

js
const highlightedItems = userList.querySelectorAll(".highlighted");

highlightedItems.forEach((userItem) => {
  deleteUser(userItem);
});

Attributwerte escapen

Dieses Beispiel zeigt, dass, wenn ein HTML-Dokument eine id enthält, die kein gültiger CSS-Bezeichner ist, wir den Attributwert escapen müssen, bevor wir ihn in querySelectorAll() verwenden.

HTML

Im folgenden Code hat ein <div>-Element eine id von "this?element", was kein gültiger CSS-Bezeichner ist, da das Zeichen "?" in CSS-Bezeichnern nicht erlaubt ist.

Wir haben auch drei Schaltflächen und ein <pre>-Element zum Protokollieren von Fehlern.

html
<div id="this?element"></div>

<button id="no-escape">No escape</button>
<button id="css-escape">CSS.escape()</button>
<button id="manual-escape">Manual escape</button>

<pre id="log"></pre>

CSS

css
div {
  background-color: blue;
  margin: 1rem 0;
  height: 100px;
  width: 200px;
}

JavaScript

Alle drei Schaltflächen versuchen beim Klicken, das <div> auszuwählen und dann seine Hintergrundfarbe auf einen zufälligen Wert zu setzen.

  • Die erste Schaltfläche verwendet den Wert "this?element" direkt.
  • Die zweite Schaltfläche escapet den Wert mit CSS.escape().
  • Die dritte Schaltfläche escapet das "?"-Zeichen explizit mit einem Backslash. Beachten Sie, dass wir auch den Backslash selbst escapen müssen, indem wir einen weiteren Backslash verwenden, so: "\\?".
js
const log = document.querySelector("#log");

function random(number) {
  return Math.floor(Math.random() * number);
}

function setBackgroundColor(id) {
  log.textContent = "";

  try {
    const elements = document.querySelectorAll(`#${id}`);
    const randomColor = `rgb(${random(255)} ${random(255)} ${random(255)})`;
    elements[0].style.backgroundColor = randomColor;
  } catch (e) {
    log.textContent = e;
  }
}

document.querySelector("#no-escape").addEventListener("click", () => {
  setBackgroundColor("this?element");
});

document.querySelector("#css-escape").addEventListener("click", () => {
  setBackgroundColor(CSS.escape("this?element"));
});

document.querySelector("#manual-escape").addEventListener("click", () => {
  setBackgroundColor("this\\?element");
});

Ergebnis

Ein Klick auf die erste Schaltfläche führt zu einem Fehler, während die zweite und dritte Schaltfläche ordnungsgemäß funktionieren.

Spezifikationen

Specification
DOM Standard
# ref-for-dom-parentnode-queryselectorall①

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch