Объектная модель браузера (BOM)
DOM и BOM
DOM описывает документ — узлы HTML на странице (работа с HTML).
BOM (Browser Object Model) описывает окружение браузера: окно, адресная строка, история переходов, данные об устройстве, размеры viewport. Корневой объект — window; в браузере глобальные переменные и функции (alert, setTimeout) живут в его области видимости.
console.log(window === globalThis); // true в современных браузерах
В Node.js вместо window — global / globalThis; DOM и BOM там нет.
Объект location
window.location (и сокращение document.location) отражает URL текущей страницы.
| Свойство / метод | Назначение |
|---|---|
href | полный URL |
pathname | путь без домена (/catalog/item) |
search | строка запроса (?id=5) |
hash | фрагмент (#reviews) |
assign(url) | переход с записью в history |
replace(url) | переход без новой записи в history |
reload() | перезагрузка страницы |
const params = new URLSearchParams(location.search);
const id = params.get('id');
if (!id) {
location.assign('/catalog');
}
Чтение location без присваивания безопасно; location.href = '...' и location.assign() инициируют навигацию. Для SPA чаще меняют маршрут через History API или роутер фреймворка, не полную перезагрузку.
Объект history
window.history хранит стек переходов в рамках одного источника (origin).
| Метод | Действие |
|---|---|
back() | шаг назад |
forward() | шаг вперёд |
go(n) | на n шагов (-1 — назад) |
pushState(state, title, url?) | добавить запись без перезагрузки |
replaceState(state, title, url?) | заменить текущую запись |
history.pushState({ page: 'settings' }, '', '/app/settings');
window.addEventListener('popstate', (event) => {
console.log('Навигация назад/вперёд', event.state);
});
Событие popstate срабатывает при кнопках «назад/вперёд», не при pushState из скрипта. Данные state — произвольный сериализуемый объект; не кладите туда секреты.
Объект navigator
navigator — сведения о браузере и возможностях устройства.
| Свойство / API | Типичное использование |
|---|---|
userAgent | строка клиента (осторожно: подделывается, не для жёсткой логики) |
language / languages | предпочитаемые языки интерфейса |
onLine | есть ли сеть (грубая оценка) |
clipboard | Clipboard API — копирование текста |
serviceWorker | регистрация фонового скрипта (PWA) |
mediaDevices | камера/микрофон (WebRTC) |
if (!navigator.onLine) {
showBanner('Нет подключения — часть функций недоступна');
}
Проверка возможностей: 'geolocation' in navigator, 'serviceWorker' in navigator — надёжнее, чем разбор userAgent.
Размеры окна и прокрутка
| API | Что измеряет |
|---|---|
window.innerWidth / innerHeight | viewport с полосами прокрутки |
window.outerWidth / outerHeight | всё окно браузера с рамками |
document.documentElement.clientWidth | ширина области просмотра <html> |
window.scrollX, window.scrollY | смещение прокрутки страницы |
window.scrollTo(x, y) | программная прокрутка |
element.scrollIntoView() | прокрутить к элементу |
window.addEventListener('scroll', () => {
const scrolled = window.scrollY;
document.body.classList.toggle('header--compact', scrolled > 80);
}, { passive: true });
Флаг passive: true на scroll/touch подсказывает браузеру, что вы не вызовете preventDefault() — прокрутка остаётся плавной.
Размеры конкретного блока на странице — через getBoundingClientRect() и ResizeObserver, не через window.
screen, open и диалоги
window.screen — физический экран (width, height, availWidth). Нужен редко (полноэкранные режимы, аналитика).
window.open(url, target, features) — новое окно или вкладка. Всплывающие окна часто блокируются, если вызов не из прямого действия пользователя (клик).
alert, confirm, prompt — синхронные диалоги, блокируют главный поток. В продакшене UI лучше строить через разметку и модальные компоненты; нативные диалоги оставляют для отладки и простых учебных примеров.
События жизненного цикла страницы
| Событие | Когда |
|---|---|
DOMContentLoaded | DOM построен, без ожидания картинок |
load | загружены ресурсы (включая изображения) |
beforeunload | уход со страницы (можно показать предупреждение) |
resize | изменился размер окна |
hashchange | изменился #фрагмент в URL |
Инициализацию скриптов, которым нужен готовый DOM, удобно вешать на DOMContentLoaded — см. подключение кода.
Практические правила
- Не смешивайте полную перезагрузку (
location.href = …) и SPA-навигацию без понимания, что history и состояние приложения сбросятся. - Не полагайтесь на
userAgentдля ветвления логики — используйте feature detection. - Тяжёлую работу на
scrollдебаунсьте или заменяйте IntersectionObserver. - Секреты и токены не храните в
history.stateи не передавайте вhashбез необходимости.
Краткий итог
BOM — это window и связанные объекты location, history, navigator, API прокрутки и размеров. DOM меняет страницу; BOM — контекст, в котором страница открыта. Для интерактивности внутри документа сочетайте BOM с событиями и DOM.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Основы JavaScript - стандарт ECMAScript, модель выполнения и базовые конструкции языка. JavaScript — это язык программирования, который позволяет создавать интерактивные веб-страницы, серверные приложения и мобильные программы. Для создания массивов используется литеральная нотация. Конструктор Array не применяется. Как работать с HTML-элементами, как их создавать, менять. Простые приложения на JavaScript - базовые сценарии, структура кода и быстрый старт с практическими примерами. Расширения файлов определяют способ обработки кода средой выполнения или компилятором. История JavaScript - происхождение языка, ключевые этапы развития и влияние на современный веб. Такое именование представляет собой соглашение между разработчиками. Классический JavaScript не обеспечивает реальной приватности через подчеркивания. JavaScript содержит набор зарезервированных слов, которые имеют специальное значение в языке. Эти слова нельзя использовать в качестве идентификаторов для переменных, функций или классов. Встроенные функции JavaScript - ключевые методы массивов, строк и объектов для повседневной разработки. Этот шаблон описывает подключение внешних функций, классов или значений из других файлов. Он используется в начале файла и определяет зависимости текущего модуля. JavaScript используется для создания кроссплатформенных мобильных приложений, которые работают на iOS и Android с использованием единой кодовой базы.Основы JavaScript
Что требуется знать перед началом изучения языка программирования JavaScript
Рекомендации по разработке на JavaScript
Работа с HTML в JavaScript
Простые приложения на JavaScript
Форматы JavaScript
История языка JavaScript
Синтаксис и пунктуация в JavaScript
Ключевые слова языка JavaScript
Встроенные функции JavaScript
Структура и подключение JavaScript-кода
Применение JavaScript в вебе и за его пределами