Документ: метод querySelectorAll()
Базовая версия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Метод Document querySelectorAll() возвращает статический (не динамичный) NodeList, представляющий список элементов документа, соответствующих заданной группе селекторов.
Синтаксис
querySelectorAll(selectors)
Параметры
selectors-
Строка, содержащая один или несколько селекторов для сопоставления. Эта строка должна быть допустимой строкой CSS-селектора; в противном случае будет выброшено исключение
SyntaxError.Обратите внимание, что спецификация HTML не требует, чтобы значения атрибутов были допустимыми идентификаторами CSS. Если значение атрибута
classилиidне является допустимым идентификатором CSS, необходимо экранировать его перед использованием в селекторе, либо вызвавCSS.escape()для значения, либо используя один из методов, описанных в Экранирование символов. См. Экранирование значений атрибутов для примера.
Возвращаемое значение
Нединамичный NodeList, содержащий по одному объекту Element для каждого элемента, соответствующего хотя бы одному из указанных селекторов, или пустой NodeList в случае отсутствия совпадений. Элементы упорядочены в соответствии с порядком в документе — то есть, родители перед потомками, предшествующие элементы перед последующими.
Примечание: Если указанные selectors включают псевдоэлементы CSS, возвращаемый список всегда пустой.
Исключения
-
SyntaxErrorDOMException -
Выбрасывается, если синтаксис указанной
selectorsстроки некорректен.
Примеры
Получение списка совпадений
Для получения NodeList всех элементов <p> в документе:
const matches = document.querySelectorAll("p");
Этот пример возвращает список всех элементов <div> в документе с классом либо note или alert:
const matches = document.querySelectorAll("div.note, div.alert");
Здесь мы получаем список элементов <p> , у которых непосредственный родительский элемент — <div> с классом highlighted и которые находятся внутри контейнера с идентификатором test.
const container = document.querySelector("#test");
const matches = container.querySelectorAll("div.highlighted > p");
В этом примере используется селектор атрибута для возвращения списка элементов <iframe> в документе, содержащих атрибут с именем data-src:
const matches = document.querySelectorAll("iframe[data-src]");
Здесь селектор атрибута используется для возвращения списка элементов списка, находящихся внутри списка с идентификатором user-list и имеющими атрибут data-active со значением 1:
const container = document.querySelector("#user-list");
const matches = container.querySelectorAll("li[data-active='1']");
Доступ к совпадениям
После получения NodeList совпадающих элементов, вы можете просматривать его как любой массив. Если массив пустой (т.е. его свойство length равно 0), то совпадений не найдено.
В противном случае вы можете использовать стандартную нотацию массива для доступа к содержимому списка. Вы можете использовать любые стандартные циклы, такие как:
const highlightedItems = userList.querySelectorAll(".highlighted");
highlightedItems.forEach((userItem) => {
deleteUser(userItem);
});
Экранирование значений атрибутов
Этот пример демонстрирует, что если HTML-документ содержит id, который не является допустимым CSS-идентификатором, то необходимо экранировать значение атрибута перед использованием его в querySelectorAll().
HTML
В следующем коде у элемента <div> есть атрибут id со значением "this?element", который не является допустимым CSS-идентификатором, потому что символ "?" не разрешён в CSS-идентификаторах.
У нас также есть три кнопки и элемент <pre> для регистрации ошибок.
<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
div {
background-color: blue;
margin: 1rem 0;
height: 100px;
width: 200px;
}
JavaScript
Все три кнопки при нажатии пытаются выбрать <div>, а затем установить его цвет фона случайным значением.
- Первая кнопка использует значение
"this?element"напрямую. - Вторая кнопка экранирует значение с помощью
CSS.escape(). - Третья кнопка явно экранирует символ
"?"с помощью обратного слэша. Обратите внимание, что мы также должны экранировать обратный слэш сам по себе, используя другой обратный слэш, например:"\\?".
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");
});
Результат
Нажатие первой кнопки приводит к ошибке, в то время как вторая и третья кнопки работают должным образом.
Спецификации
| Спецификация |
|---|
| DOM # ref-for-dom-parentnode-queryselectorall① |
Совместимость браузеров
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
querySelectorAll |
1 | 12 | 3.5 | 10 | 3.1 | 18 | 4 | 10.1 | 2 | 1.0 | 4.4 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll