Element: 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 Element Methode querySelectorAll() gibt eine statische (nicht dynamische) NodeList zurück, die eine Liste von Elementen darstellt, die eine bestimmte Gruppe von Selektoren erfüllen und Nachfahren des Elements sind, auf dem die Methode aufgerufen wurde.

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; wenn 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 escapen, bevor Sie ihn in einem Selektor verwenden, entweder indem Sie CSS.escape() für den Wert aufrufen oder eine der in Escaping characters beschriebenen Techniken verwenden. Siehe Escaping attribute values für ein Beispiel.

Die Selektoren werden auf das gesamte Dokument angewendet, nicht nur auf das spezielle Element, auf dem querySelectorAll() aufgerufen wird. Um den Selektor auf das Element zu beschränken, auf dem querySelectorAll() aufgerufen wird, fügen Sie die Pseudo-Klasse :scope am Anfang des Selektors hinzu. Siehe das Beispiel selector scope.

Rückgabewert

Eine nicht-dynamische NodeList, die ein Element Objekt für jeden Nachfahrenknoten enthält, der mindestens einem der angegebenen Selektoren entspricht. 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-Pseudo-Element 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

Alle Elemente mit einem benutzerdefinierten Datenwert erhalten

Dieses Beispiel verwendet den Attributselektor, um mehrere Elemente mit einem data-name Datenattribut auszuwählen, das "funnel-chart-percent" enthält.

html
<section class="box" id="sect1">
  <div data-name="funnel-chart-percent1">10.900%</div>
  <div data-name="funnel-chart-percent2">3700.00%</div>
  <div data-name="funnel-chart-percent3">0.00%</div>
</section>
js
const refs = [
  ...document.querySelectorAll(`[data-name*="funnel-chart-percent"]`),
];

Eine Liste von Treffern erhalten

Um eine NodeList aller <p> Elemente innerhalb des Elements myBox zu erhalten:

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

Dieses Beispiel gibt eine Liste aller <div> Elemente innerhalb von myBox mit einer Klasse von entweder note oder alert zurück:

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

Hier erhalten wir eine Liste der <p>-Elemente des Dokuments, deren unmittelbares Elternelement ein <div> mit der Klasse "highlighted" ist und die sich in einem Container 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 zurückzugeben, 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 innerhalb einer Liste mit der ID "user-list" zurückzugeben, die ein "data-active" Attribut mit dem Wert "1" haben:

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

Auf die Treffer zugreifen

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

Andernfalls können Sie die standardmäßige Array-Notation verwenden, um auf den Inhalt der Liste zuzugreifen. Sie können jede gängige Schleifenanweisung verwenden, wie zum Beispiel:

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

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

Hinweis: NodeList ist kein echtes Array, das heißt es hat keine Array-Methoden wie slice, some, map, usw. Um es in ein Array zu konvertieren, versuchen Sie Array.from(nodeList).

Selektorbereich

Die querySelectorAll() Methode wendet ihre Selektoren auf das gesamte Dokument an: Sie sind nicht auf das Element beschränkt, auf dem die Methode aufgerufen wird. Um die Selektoren zu fokussieren, fügen Sie die :scope Pseudo-Klasse am Anfang des Selektor-Strings hinzu.

HTML

In diesem Beispiel enthält das HTML:

  • zwei Buttons: #select und #select-scope
  • drei verschachtelte <div> Elemente: #outer, #subject und #inner
  • ein <pre> Element, welches das Beispiel zur Ausgabe verwendet.
html
<button id="select">Select</button>
<button id="select-scope">Select with :scope</button>

<div id="outer">
  #outer
  <div id="subject">
    #subject
    <div id="inner">#inner</div>
  </div>
</div>

<pre id="output"></pre>

JavaScript

Im JavaScript wählen wir zuerst das #subject Element aus.

Wenn der #select Button gedrückt wird, rufen wir querySelectorAll() auf #subject auf und übergeben "#outer #inner" als Selektor-String.

Wenn der #select-scope Button gedrückt wird, rufen wir erneut querySelectorAll() auf #subject auf, übergeben diesmal jedoch ":scope #outer #inner" als Selektor-String.

js
const subject = document.querySelector("#subject");

const select = document.querySelector("#select");
select.addEventListener("click", () => {
  const selected = subject.querySelectorAll("#outer #inner");
  output.textContent = `Selection count: ${selected.length}`;
});

const selectScope = document.querySelector("#select-scope");
selectScope.addEventListener("click", () => {
  const selected = subject.querySelectorAll(":scope #outer #inner");
  output.textContent = `Selection count: ${selected.length}`;
});

Ergebnis

Wenn wir "Select" drücken, wählt der Selektor alle Elemente mit einer ID von inner, die auch einen Vorfahren mit einer ID von outer haben. Beachten Sie, dass #outer auch außerhalb des #subject Elements in der Auswahl verwendet wird, sodass unser #inner Element gefunden wird.

Wenn wir "Select with :scope" drücken, schränkt die :scope Pseudo-Klasse den Selektorbereich auf #subject ein, sodass #outer nicht in der Selektion verwendet wird und wir das #inner Element nicht finden.

Attributwerte escapen

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

HTML

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

Wir haben auch drei Buttons und ein <pre> Element zum Protokollieren von Fehlern.

html
<div id="container">
  <div id="this?element"></div>
</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 Buttons versuchen beim Klicken, das <div> auszuwählen und dessen Hintergrundfarbe auf einen zufälligen Wert zu setzen.

  • Der erste Button verwendet den Wert "this?element" direkt.
  • Der zweite Button esacpt den Wert mit CSS.escape().
  • Der dritte Button escapt das "?"-Zeichen explizit mit einem Backslash. Beachten Sie, dass wir auch den Backslash selbst mit einem weiteren Backslash escapen müssen, wie: "\\?".
js
const container = document.querySelector("#container");
const log = document.querySelector("#log");

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

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

  try {
    const elements = container.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

Das Klicken auf den ersten Button gibt einen Fehler aus, während der zweite und dritte Button ordnungsgemäß funktionieren.

Spezifikationen

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

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch