Перейти к основному содержимому

Нативные уведомления в браузере — Notification API

Разработчику

См. также: События · Асинхронность · BOM и navigator · Кнопка "Поделиться" · Кнопка с загрузкой в React · Canvas 2D · Web API в браузере · Web API на практике - примеры кода


Задача

Пользователь нажимает кнопку на сайте, после чего браузер показывает системное уведомление. Сценарий работает нативно через возможности браузера и операционной системы, без создания отдельного desktop-приложения.

Базовые шаги:

  1. Проверить поддержку API.
  2. Запросить разрешение у пользователя.
  3. Показать уведомление после разрешения.

Критерии полезного push-уведомления

Уведомление оправдано, если ведёт к конкретному действию с понятным контекстом — "отчёт готов", "платёж подтверждён", "новая заявка ждёт ответа". Редкие точные события удерживают разрешение; частые однотипные сообщения пользователь отключает.


Что такое Notification API

Notification API позволяет странице показывать системные уведомления, похожие на уведомления от мессенджеров и почты.

У API два основных сценария:

СценарийМетод
Страница открыта, пользователь кликнул кнопкуnew Notification(title, options)
Фоновые уведомления через Service Workerregistration.showNotification(title, options)

Для учебного старта чаще используют new Notification(...) из обработчика клика.


Проверка поддержки и разрешения

Перед запуском проверяют, существует ли глобальный объект Notification:

if (!('Notification' in window)) {
alert('Этот браузер не поддерживает Notification API');
}

Разбор:

  • В этом фрагменте используется конструкция if (!('Notification' in window)) { как точка входа сценария.
  • Код показывает последовательность действий: получение данных, проверка условий и выполнение целевого действия.
  • Ключевые вызовы и свойства опираются на стандартные API JavaScript/браузера, поэтому шаблон легко перенести в реальный проект.
  • Такой пример удобно расширять обработкой ошибок, логированием и дополнительной валидацией входных данных.

Разрешение хранится в Notification.permission:

ЗначениеЧто означает
defaultпользователь ещё не принял решение
grantedпоказывать уведомления можно
deniedбраузер блокирует уведомления для сайта

Запрос разрешения:

const permission = await Notification.requestPermission();

Разбор:

  • В этом фрагменте используется конструкция const permission = await Notification.requestPermission(); как точка входа сценария.
  • Код показывает последовательность действий: получение данных, проверка условий и выполнение целевого действия.
  • Используется асинхронное выполнение (async/await), поэтому интерфейс остаётся отзывчивым, пока операция не завершится.
  • Ключевые вызовы и свойства опираются на стандартные API JavaScript/браузера, поэтому шаблон легко перенести в реальный проект.
  • Такой пример удобно расширять обработкой ошибок, логированием и дополнительной валидацией входных данных.

Обычно этот вызов запускают по действию пользователя, например в click, чтобы браузер не заблокировал запрос.


Пример с кнопкой и new Notification

HTML:

<button id="notify-btn" type="button">Проверить уведомление</button>
<script src="notify.js"></script>

Разбор:

  • В этом фрагменте используется конструкция <button id="notify-btn" type="button">Проверить уведомление</button> как точка входа сценария.
  • Разметка задаёт опорные элементы интерфейса, к которым затем подключается JavaScript-логика.
  • Ключевые вызовы и свойства опираются на стандартные API JavaScript/браузера, поэтому шаблон легко перенести в реальный проект.
  • Такой пример удобно расширять обработкой ошибок, логированием и дополнительной валидацией входных данных.

JavaScript (notify.js):

Код ITЗагрузка примера кода…

Разбор:

  • В этом фрагменте используется конструкция const button = document.querySelector('#notify-btn'); как точка входа сценария.
  • Код показывает последовательность действий: получение данных, проверка условий и выполнение целевого действия.
  • Поиск элементов через querySelector явно привязывает сценарий к нужным узлам DOM.
  • Подписка через addEventListener связывает поведение с действием пользователя и отделяет логику от HTML-разметки.
  • Используется асинхронное выполнение (async/await), поэтому интерфейс остаётся отзывчивым, пока операция не завершится.
  • Ключевые вызовы и свойства опираются на стандартные API JavaScript/браузера, поэтому шаблон легко перенести в реальный проект.
  • Такой пример удобно расширять обработкой ошибок, логированием и дополнительной валидацией входных данных.

Поля уведомления в options

ПолеНазначение
bodyдополнительный текст
iconиконка уведомления
imageкрупное изображение, если поддерживается платформой
tagидентификатор для группировки похожих уведомлений
renotifyповторный сигнал при том же tag
silentуведомление без звука
dataслужебные данные для обработки клика

Платформы показывают эти поля по-разному. Часть опций может игнорироваться на конкретном устройстве.


Ограничения и практические правила

ПравилоЧто делать
Запрашивать разрешение только в контексте действия пользователявызывать requestPermission() внутри click
Уведомления доступны в безопасном контекстеиспользовать https или localhost в разработке
Пользователь может отключить уведомления в настройкахпроверять Notification.permission перед показом
Частые уведомления раздражаютотправлять только полезные события
Разный уровень поддержки браузеровдобавлять fallback внутри UI

Fallback обычно делают через инлайн-сообщение в интерфейсе, toast или копирование ссылки в буфер.


Когда нужен Service Worker

new Notification(...) работает, пока страница активна. Для фоновых сценариев, когда вкладка закрыта или свернута, применяют связку Push API + Service Worker + showNotification(...).

Пример в Service Worker:

Код ITЗагрузка примера кода…

Разбор:

  • В этом фрагменте используется конструкция self.addEventListener('push', (event) => { как точка входа сценария.
  • Код показывает последовательность действий: получение данных, проверка условий и выполнение целевого действия.
  • Подписка через addEventListener связывает поведение с действием пользователя и отделяет логику от HTML-разметки.
  • Ключевые вызовы и свойства опираются на стандартные API JavaScript/браузера, поэтому шаблон легко перенести в реальный проект.
  • Такой пример удобно расширять обработкой ошибок, логированием и дополнительной валидацией входных данных.

Этот путь сложнее, зато подходит для реальных push-уведомлений от сервера.


Частые ошибки

СимптомПричина
requestPermission всегда возвращает deniedпользователь ранее запретил уведомления
Уведомление не показывается после new Notificationсайт открыт по http, а не https
Код работает в одном браузере и не работает в другомразличия в поддержке опций и политик
Пользователь получает много одинаковых уведомленийнет tag и дедупликации событий

Политика уведомлений в продукте

Качество уведомлений определяется не только API, но и продуктовой дисциплиной:

  • уведомление приходит по событию с ценностью для пользователя;
  • частота ограничена правилами дедупликации и quiet-hours;
  • каждое уведомление ведёт в конкретный экран действия;
  • у пользователя есть настройка отключения отдельных типов событий.

Такой подход удерживает высокий CTR и снижает вероятность полного запрета разрешения на уровне браузера.


Чек-лист внедрения Notification API

ШагЧто проверить
Проверка возможностей'Notification' in window и статус Notification.permission
Разрешениезапрос только по действию пользователя
Безопасностьзапуск через HTTPS и безопасная обработка ссылок в onclick
Дедупликацияиспользование tag для повторяющихся событий
Фоновый режимService Worker + showNotification для push-сценариев

Полезно связывать уведомления с потоковыми обновлениями, чтобы интерфейс и системные события показывали согласованное состояние задач.


Краткий итог

  1. Нативные уведомления на сайте запускают через Notification API.
  2. Перед показом уведомления проверяют поддержку и разрешение пользователя.
  3. Базовый рабочий сценарий для открытой вкладки — new Notification(title, options).
  4. Фоновые push-уведомления реализуют через Service Worker и showNotification.
  5. Надёжный UX строится на уместной частоте уведомлений и fallback внутри интерфейса.