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 live) NodeList zurück, die eine Liste von Elementen darstellt, die der angegebenen Gruppe von Selektoren entsprechen, welche 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 abgeglichen werden sollen. Dieser String muss ein gültiger CSS-Selektor-String sein; andernfalls 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 entweder durch Aufrufen von CSS.escape() für den Wert oder durch eine der in Escape-Zeichen beschriebenen Techniken escapen. Siehe Escaping von Attributwerten für ein Beispiel.

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

Rückgabewert

Eine nicht-live NodeList, die ein Element Objekt für jeden Nachfahrenknoten enthält, der mindestens einem der angegebenen Selektoren entspricht. Die Elemente befinden sich in Dokumentenreihenfolge — 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 ungültig ist.

Beispiele

Abrufen aller Elemente mit einem benutzerdefinierten Datenwert

Dieses Beispiel verwendet den Attributselektor, um mehrere Elemente auszuwählen, die ein data-name Datenattribut enthalten, welches "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"]`),
];

Erhalten einer Liste von Übereinstimmungen

Um eine NodeList aller <p> Elemente zu erhalten, die sich in dem Element myBox befinden:

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

Dieses Beispiel gibt eine Liste aller <div> Elemente in myBox zurück, die entweder die Klasse note oder alert haben:

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

Hier erhalten wir eine Liste von <p> Elementen des Dokuments, deren unmittelbares übergeordnetes Element 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']");

Zugriff auf die Übereinstimmungen

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

Andernfalls können Sie die Standard-Array-Notation verwenden, um auf den Inhalt der Liste zuzugreifen. Sie können jede übliche 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 verfügt nicht über Array-Methoden wie slice, some, map, usw. Um es in ein Array zu konvertieren, können Sie Array.from(nodeList) versuchen.

Selektor-Scope

Die Methode querySelectorAll() wendet ihre Selektoren auf das gesamte Dokument an: Sie sind nicht auf das Element begrenzt, auf dem die Methode aufgerufen wird. Um die Selektoren zu begrenzen, 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, das das Beispiel für die 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() für #subject auf und übergeben "#outer #inner" als Selektor-String.

Wenn der #select-scope Button gedrückt wird, rufen wir erneut querySelectorAll() für #subject auf, aber dieses Mal übergeben wir ":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 aus, die auch einen Vorfahren mit einer ID von outer haben. Beachten Sie, dass selbst wenn #outer außerhalb des #subject Elements liegt, es trotzdem in der Auswahl verwendet wird, sodass unser #inner Element gefunden wird.

Wenn wir "Select with :scope" drücken, beschränkt die :scope Pseudo-Klasse den Selektor-Scope auf #subject, sodass #outer nicht in die Selektorauswahl einbezogen wird, und wir das #inner Element nicht finden.

Escaping von Attributwerten

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", die kein gültiger CSS-Bezeichner ist, weil 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, wenn sie geklickt werden, das <div> zu wählen und dann seine Hintergrundfarbe auf einen zufälligen Wert zu setzen.

  • Der erste Button verwendet den "this?element" Wert direkt.
  • Der zweite Button escapet den Wert mit CSS.escape().
  • Der dritte Button escapet explizit das "?" Zeichen mit einem Backslash. Beachten Sie, dass wir auch den Backslash selbst escapen müssen, mit einem weiteren Backslash, 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 ergibt einen Fehler, während die zweiten und dritten Buttons ordnungsgemäß funktionieren.

Spezifikationen

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

Browser-Kompatibilität

Siehe auch