Справочник · JavaScript
getElementById: находим элемент по id
Метод document.getElementById() возвращает элемент, у которого атрибут id совпадает с переданной строкой, или null, если такого элемента нет. id передают без решётки: getElementById('menu'). Это самый быстрый и простой способ найти один конкретный элемент на странице.
document.getElementById('menu')— без#в начале.- Нет элемента — вернётся
null, проверяй результат. - Метод есть у
document, но не у обычных элементов. - id на странице должен быть уникальным; при дублях вернётся первый.
- Для любых селекторов —
querySelector, для одного id оба подходят.
Минимальный пример
<p id="status">Ждём действия</p>
<button id="save" type="button">Сохранить</button>const status = document.getElementById('status');
const save = document.getElementById('save');
if (status && save) {
save.addEventListener('click', () => {
status.textContent = 'Сохранено';
});
}Скрипт находит абзац и кнопку по их id и по клику меняет текст. Проверка if (status && save) защищает от ошибки, если на этой странице элементов нет.
Синтаксис
const element = document.getElementById(id);| Значение | |
|---|---|
| Аргумент | строка с id без #, с учётом регистра |
| Возвращает | элемент или null |
| Где вызывать | у document (а также у фрагмента и shadow root) |
| Если id повторяется | первый элемент в порядке документа |
Почему вернулся null
Три самые частые причины: опечатка или неверный регистр (Menu и menu — разные id); решётка в аргументе (getElementById('#menu') ищет id «#menu»); скрипт выполнился раньше, чем браузер разобрал нужный HTML.
<!-- скрипт в head: элементов ещё нет -->
<script src="app.js"></script>
<!-- правильно: отложить выполнение -->
<script src="app.js" defer></script>С атрибутом defer скрипт выполнится после разбора всего HTML. Второй вариант — подключать скрипт перед закрывающим </body>. Если результат всё равно null, выведи его в консоль и проверь id в панели Elements.
getElementById, querySelector и другие
| Метод | Ищет | Возвращает |
|---|---|---|
getElementById('save') | по id | элемент или null |
querySelector('#save') | по любому CSS-селектору | первый элемент или null |
querySelectorAll('.card') | по CSS-селектору | статичный NodeList, возможно пустой |
getElementsByClassName('card') | по классу | живая HTMLCollection |
getElementsByTagName('li') | по тегу | живая HTMLCollection |
«Живая» коллекция сама обновляется при изменении DOM: если удалить элемент с классом, он исчезнет и из коллекции. Это ломает циклы, которые удаляют элементы по ходу. NodeList из querySelectorAll статичный, с ним такой проблемы нет.
id, который начинается с цифры
document.getElementById('1tab'); // работает
document.querySelector('#1tab'); // ошибка: неверный селектор
document.querySelector('#' + CSS.escape('1tab')); // работаетВ HTML id может начинаться с цифры, но в CSS-селекторе так писать нельзя. getElementById принимает строку, а не селектор, поэтому экранирование ему не нужно. Это одно из немногих практических преимуществ метода перед querySelector.
Почему нет element.getElementById
const card = document.getElementById('card-12');
card.getElementById('price'); // TypeError: не функция
card.querySelector('.price'); // правильноid уникален на всю страницу, поэтому искать его внутри элемента не имеет смысла — метод есть только у документа. Для поиска внутри конкретного блока используй element.querySelector().
Глобальные переменные по id
Браузеры создают глобальную переменную с именем id: элемент <div id="menu"> доступен как window.menu и просто menu. Не полагайся на это: такая переменная перекрывается любой одноимённой, ломается с id вроде main-menu и делает код непонятным. Явный getElementById надёжнее.
Уникальность id
По стандарту id в документе должен быть уникальным. При дублях getElementById вернёт первый элемент, а второй останется недоступным — ошибку легко пропустить. Ещё хуже для форм: label for="email" привяжется только к первому полю. Если одинаковых элементов несколько (карточки, кнопки в списке), используй класс или data-атрибут и querySelectorAll.
getElementById или querySelector
Один элемент с известным id: кнопка, форма, область статуса. Короче не бывает, работает с id из цифр.
Любой селектор: класс, атрибут, вложенность. Работает и у элементов, не только у document.
Скорость у обоих на практике одинаково высокая: разница в долях миллисекунды, выбирать стоит по удобству.
Частые ошибки
- Пишут решётку:
getElementById('#menu'). - Путают регистр: id
Menuне найдётся по строкеmenu. - Подключают скрипт в head без
defer, и элемент ещё не существует. - Вызывают
element.getElementById— у элементов такого метода нет. - Дают одинаковый id нескольким элементам и получают только первый.
Доступность
id нужен не только скриптам: на нём держатся связи доступности. label for, aria-labelledby, aria-describedby и якорные ссылки ссылаются на id. Поэтому уникальность id важна для скринридеров так же, как для JavaScript. Меняя текст элемента через скрипт, сообщай о важных изменениях через область с aria-live.
Поддержка браузерами
getElementById — один из старейших методов DOM, работает во всех браузерах. CSS.escape из примера поддерживается всеми актуальными браузерами.
Практика
На странице есть поле id="name", кнопка id="greet" и абзац id="result". По клику на кнопку выведи в абзац «Привет, …!» с именем из поля. Если поле пустое, напиши «Введите имя». Код не должен падать, если на странице нет какого-то из элементов.
Показать решение
const input = document.getElementById('name');
const button = document.getElementById('greet');
const result = document.getElementById('result');
if (input && button && result) {
button.addEventListener('click', () => {
const name = input.value.trim();
result.textContent = name ? `Привет, ${name}!` : 'Введите имя';
});
}Частые вопросы
Нужна ли решётка в getElementById?
Нет. Метод принимает сам id: getElementById('menu'). Решётка нужна только в CSS-селекторах, например в querySelector('#menu').
Почему getElementById возвращает null?
Элемента с таким id нет: опечатка, другой регистр, лишняя решётка или скрипт выполнился до появления HTML. Подключай скрипт с атрибутом defer.
Что быстрее: getElementById или querySelector?
getElementById немного быстрее, но разница незаметна. Выбирай по удобству: для одного id подходят оба.
Можно ли найти по id внутри другого элемента?
Нет, метод есть только у document. Внутри элемента используй element.querySelector('#id') или класс.
Что вернёт метод, если id повторяется?
Первый элемент с этим id в порядке документа. Дублировать id нельзя — используй класс.