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
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
- oderid
-Attributwert kein gültiger CSS-Bezeichner ist, müssen Sie ihn escapen, bevor Sie ihn in einem Selektor verwenden, entweder indem SieCSS.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 demquerySelectorAll()
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.
<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>
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:
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:
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.
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:
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:
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:
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.
<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.
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.
<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
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:"\\?"
.
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
- DOM-Elemente mit Selektoren lokalisieren
- Attributselektoren im CSS-Leitfaden
- Attributselektoren in der MDN Lernbereich
Element.querySelector()
Document.querySelector()
undDocument.querySelectorAll()
DocumentFragment.querySelector()
undDocumentFragment.querySelectorAll()