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 Juli 2015.
Die Methode querySelectorAll() des Element
gibt eine statische (nicht dynamische) NodeList zurück, die eine Liste der
Elemente darstellt, die mit der angegebenen Gruppe von Selektoren übereinstimmen, welche Nachkommen 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; ist er das nicht, wird eine
SyntaxError-Ausnahme ausgelöst.Beachten Sie, dass die HTML-Spezifikation nicht verlangt, dass Attributwerte gültige CSS-Bezeichner sind. Wenn ein
class- oderid-Attributwert kein gültiger CSS-Bezeichner ist, müssen Sie ihn vor der Verwendung in einem Selektor escapen, entweder indem SieCSS.escape()auf den Wert anwenden 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 das
querySelectorAll()aufgerufen wird. Um den Selektor auf das Element zu beschränken, auf demquerySelectorAll()aufgerufen wird, fügen Sie die:scope-Pseudoklasse am Anfang des Selektors hinzu. Siehe das Beispiel selector scope.
Rückgabewert
Eine nicht-dynamische NodeList, die ein Element-Objekt für jeden nachgeordneten Knoten enthält, der mit mindestens einem der angegebenen Selektoren übereinstimmt. 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
SyntaxErrorDOMException-
Wird ausgelöst, wenn die Syntax des angegebenen
selectors-Strings nicht gültig ist.
Beispiele
>Alle Elemente mit einem benutzerdefinierten Datenwert abrufen
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 Übereinstimmungen erhalten
Um eine NodeList aller <p>-Elemente zu erhalten, die innerhalb des Elements myBox enthalten sind:
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 innerhalb eines Containers 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 mit dem Namen "data-src" enthalten:
const matches = document.querySelectorAll("iframe[data-src]");
Hier wird ein Attributselektor verwendet, um eine Liste der Listenelemente zurückzugeben, die innerhalb
einer Liste mit der ID "user-list" enthalten sind und ein "data-active"-
Attribut mit dem Wert "1" haben:
const container = document.querySelector("#user-list");
const matches = container.querySelectorAll("li[data-active='1']");
Zugriff auf die Übereinstimmungen
Sobald die NodeList mit den übereinstimmenden Elementen zurückgegeben wird, können Sie sie
wie jedes Array untersuchen. Wenn das Array leer ist (das heißt, 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 gängige Schleifenanweisung verwenden, beispielsweise:
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, etc. Um es in ein Array umzuwandeln, versuchen Sie
Array.from(nodeList).
Selektorbereich
Die Methode querySelectorAll() 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 beschränken, fügen Sie die :scope-Pseudoklasse am Anfang des Selektor-Strings hinzu.
HTML
In diesem Beispiel enthält das HTML:
- zwei Schaltflächen:
#selectund#select-scope - drei verschachtelte
<div>-Elemente:#outer,#subjectund#inner - ein
<pre>-Element, das im Beispiel für die Ausgabe verwendet wird.
<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 die Schaltfläche #select gedrückt wird, rufen wir querySelectorAll() auf #subject auf und übergeben "#outer #inner" als Selektor-String.
Wenn die Schaltfläche #select-scope gedrückt wird, rufen wir erneut querySelectorAll() auf #subject auf, aber dieses Mal übergeben wir ":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 aus, die auch einen Vorfahren mit einer ID von outer haben. Beachten Sie, dass auch wenn #outer außerhalb des #subject-Elements liegt, es immer noch bei der Auswahl verwendet wird, sodass unser #inner-Element gefunden wird.
Wenn wir "Select with :scope" drücken, beschränkt die :scope-Pseudoklasse den Selektorbereich auf #subject, sodass #outer nicht bei der Auswahlanpassung 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, 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.
<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 Schaltflächen versuchen, wenn sie geklickt werden, 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, mit einem weiteren Backslash, 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 die erste Schaltfläche erzeugt einen Fehler, während die zweite und dritte Schaltfläche korrekt funktionieren.
Spezifikationen
| Specification |
|---|
| DOM> # ref-for-dom-parentnode-queryselectorall①> |
Browser-Kompatibilität
Loading…
Siehe auch
- Auswahl und Traversierung auf dem DOM-Baum
- Attributselektoren im CSS Leitfaden
- Attributselektoren im MDN Learning-Bereich
Element.querySelector()Document.querySelector()undDocument.querySelectorAll()DocumentFragment.querySelector()undDocumentFragment.querySelectorAll()