</> Praktum

Главная / JavaScript / getElementById

Справочник · JavaScript

getElementById: находим элемент по id

Редакция PraktumОбновлено 6 мин чтенияУровень: новичок

Метод 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);
getElementById
Значение
Аргументстрока с 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

getElementById

Один элемент с известным id: кнопка, форма, область статуса. Короче не бывает, работает с id из цифр.

querySelector

Любой селектор: класс, атрибут, вложенность. Работает и у элементов, не только у 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 нельзя — используй класс.

Источники

Ещё в разделе JavaScript