querySelector(selector) повертає перший елемент, що відповідає CSS-селектору, або null. querySelectorAll(selector) - усі відповідні елементи.
const form = document.querySelector('#order-form');
const firstError = document.querySelector('.field.is-invalid input');
const buttons = document.querySelectorAll('[data-action="delete"]');
buttons.forEach((button) => button.addEventListener('click', onDelete));
Селектор - будь-який валідний CSS: класи, атрибути, псевдокласи (:checked, :not(...)), комбінатори.
querySelectorAll повертає статичний NodeList - знімок на момент виклику. Елементи, додані пізніше, у ньому не з'являться. У NodeList є forEach, але немає map і filter - для них [...nodes] чи Array.from(nodes).
Старші методи:
getElementById('id')- найшвидший пошук за id, повертає елемент абоnull;getElementsByClassName,getElementsByTagName- повертають живуHTMLCollection, яка оновлюється разом з DOM. Це може дивувати: видалення елементів у циклі по такій колекції пропускає кожен другий.
Пошук не лише від document. Усі методи працюють і на елементі - пошук тоді обмежується його нащадками:
const card = document.querySelector('.product-card');
const price = card.querySelector('.price');
closest(selector) шукає вгору - найближчого предка (або сам елемент), що відповідає селектору. Незамінний при делегуванні подій:
document.addEventListener('click', (event) => {
const row = event.target.closest('tr[data-id]');
if (row) openOrder(row.dataset.id);
});
matches(selector) - чи відповідає сам елемент селектору.
Пастки:
- перевіряти на
null:document.querySelector('.missing').classListкинеTypeError. Або?., або явна перевірка; - id, що починаються з цифри чи містять спецсимволи, треба екранувати в селекторі:
document.querySelector(`#${CSS.escape(id)}`); - скрипт виконується до розмітки: якщо
<script>у<head>безdefer, елементів ще немає. Розв'язується атрибутомdeferчиtype="module"; - динамічний вміст (Livewire, Alpine, підвантаження) замінює елементи - збережені посилання вказують на вузли, яких уже немає на сторінці. Делегування подій чи повторний пошук після оновлення.