Отображение динамических сообщений с использованием API веб-уведомлений было рассмотрено Джулианом Моц . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Мы живем в мире, где уведомления от ваших любимых веб-сайтов или приложений больше не существуют в пределах вашего смартфона. Сейчас стало обычным получать уведомления прямо из вашего браузера. Например, Facebook отправляет вам уведомления, если у вас есть новый запрос на добавление в друзья или кто-то комментирует историю, в которой вы упомянуты. Slack, популярное приложение для обмена сообщениями, отправляет вам уведомления, когда вы упоминаетесь в разговоре.
Как разработчику интерфейса мне было интересно, как я могу использовать уведомления браузера для веб-сайтов, которые не имеют дело с большими потоками информации. Как я могу добавить уведомления браузера, которые имеют отношение к посетителю в зависимости от его интереса к моему сайту?
В этой статье мы внедрим систему уведомлений на веб-сайте Concise CSS, которая будет предупреждать посетителей каждый раз, когда выпускается новая версия платформы. Я собираюсь показать вам, как я достиг этого, используя localStorage с API-интерфейсом уведомления браузера.
Основы API уведомлений
Для начала нам нужно определить, поддерживаются ли уведомления веб-браузером посетителя. Основную работу в этом учебном пособии выполняет объект уведомления .
(function() { if ("Notification" in window) { } })();
Пока мы только определили, поддерживаются ли уведомления браузером нашего посетителя. После того как мы установили это, нам нужно знать, можем ли мы отображать разрешения для посетителя.
Мы сохраняем выходные данные permission
в переменной. Если разрешение предоставлено или отказано, мы ничего не возвращаем. Если мы не запрашивали разрешение раньше, мы делаем это с помощью метода requestPermission .
(function() { if ("Notification" in window) { var permission = Notification.permission; if (permission === "denied" || permission === "granted") { return; } Notification.requestPermission(); } })();
Вы должны увидеть уведомление в вашем веб-браузере, похожее на изображение выше.
Теперь, когда мы запросили разрешение, давайте изменим наш код для отображения уведомления, если разрешение разрешено:
(function() { if ("Notification" in window) { var permission = Notification.permission; if (permission === "denied" || permission === "granted") { return; } Notification .requestPermission() .then(function() { var notification = new Notification("Hello, world!"); }); } })();
Скучно, но функционально.
Здесь мы используем синтаксис на основе requestPermission()
метода requestPermission()
для отображения уведомления после предоставления разрешения. Мы отображаем уведомление с помощью конструктора уведомлений . Этот конструктор принимает два параметра: один для заголовка уведомления и один для параметров. Перейдите по ссылке на документацию, чтобы найти полный список опций, которые можно пропустить.
Хранение версий фреймворка
Ранее в этой статье я упоминал, что мы будем использовать localStorage для отображения уведомлений. Использование localStorage является предпочтительным методом хранения постоянной клиентской информации в JavaScript. Мы будем создавать ключ localStorage с именем conciseVersion
который будет содержать текущую версию платформы (например, 1.0.0). Затем мы можем использовать этот ключ для проверки новых версий фреймворка.
Как обновить значение нашего ключа conciseVersion
последней версией фреймворка? Нам нужен способ установки текущей версии, когда кто-то посещает веб-сайт. Мы также должны обновлять это значение всякий раз, когда выпускается новая версия. Каждый раз, когда conciseVersion
значение conciseVersion
, нам нужно отобразить уведомление для посетителя, анонсирующего новую версию фреймворка.
Мы собираемся решить эту проблему, добавив скрытый элемент на страницу. Этот элемент будет иметь класс с именем js-currentVersion
и будет содержать только текущую версию фреймворка. Поскольку этот элемент существует в DOM, мы можем легко взаимодействовать с ним, используя JavaScript.
Этот скрытый элемент будет использоваться для хранения версии фреймворка в нашем ключе conciseVersion
. Мы также будем использовать этот элемент для обновления этого ключа каждый раз, когда будет выпущена новая версия платформы.
<span class="js-currentVersion" aria-hidden="true">3.4.0</span>
Мы можем использовать немного CSS, чтобы скрыть этот элемент:
[aria-hidden="true"] { display: none; visibility: hidden; }
Примечание. Поскольку этот элемент не содержит значимого содержимого, для программ чтения с экрана нет необходимости обращаться к этому элементу. Вот почему я установил атрибут aria-hidden в
true
и использовалdisplay: none
в качестве средства скрытия элемента. Пожалуйста, обратитесь к этой статье WebAIM для получения дополнительной информации о сокрытии контента.
Теперь мы можем взять этот элемент и взаимодействовать с ним в JavaScript. Нам нужно написать функцию, которая возвращает текст внутри скрытого элемента, который мы только что создали.
function checkVersion() { var latestVersion = document.querySelector(".js-currentVersion").textContent; }
Эта функция хранит содержимое элемента .js-currentVersion
с помощью свойства textContent . Давайте добавим еще одну переменную, которая будет хранить содержимое нашего ключа conciseVersion
localStorage
.
function checkVersion() { var latestVersion = document.querySelector(".js-currentVersion").textContent; var currentVersion = localStorage.getItem("conciseVersion"); }
Теперь у нас есть последняя версия нашего фреймворка в переменной, и мы localStorage
наш ключ localStorage
в переменной. Пришло время добавить логику, которая определяет, доступна ли новая версия фреймворка.
Сначала мы проверим, существует conciseVersion
ключ conciseVersion
. Если этого не произойдет, мы отобразим уведомление для пользователя, так как это, скорее всего, его первое посещение. Если ключ существует, мы проверяем, что его значение (хранится в переменной currentVersion
) больше, чем значение текущей версии (хранится в переменной latestVersion
). Если последняя версия фреймворка больше той, которую посетитель видел в последний раз, мы знаем, что выпущена новая версия.
Примечание . Мы используем библиотеку semver-Compare для сравнения двух версий версий.
Зная это, мы показываем уведомление посетителю и соответствующим образом обновляем наш ключ conciseVersion
.
function checkVersion() { var latestVersion = document.querySelector(".js-currentVersion").textContent; var currentVersion = localStorage.getItem("conciseVersion"); if (currentVersion === null || semverCompare(currentVersion, latestVersion) === -1) { var notification = new Notification("Hello, world!"); localStorage.setItem("conciseVersion", latestVersion); } }
Чтобы использовать эту функцию, нам нужно изменить наш код разрешения ниже.
(function() { if ("Notification" in window) { var permission = Notification.permission; if (permission === "denied") { return; } else if (permission === "granted") { return checkVersion(); } Notification.requestPermission().then(function() { checkVersion(); }); } })();
Это позволяет нам отображать уведомления, если пользователь предоставил разрешение ранее или если разрешение только что было предоставлено.
Отображение уведомлений
До сих пор мы отображали пользователю только простые уведомления, которые не содержат много информации. Давайте напишем функцию, которая позволяет нам создавать уведомления браузера на лету и контролировать различные аспекты нашего уведомления.
Эта функция имеет параметры для основного текста, значка, заголовка, а также необязательную ссылку и продолжительность уведомления. Внутри мы создаем объект параметров, в котором хранятся текст и значок нашего уведомления. Мы также создаем новый экземпляр объекта Notification
, передавая название нашего уведомления, а также объект параметров.
Затем мы добавляем обработчик onclick
если мы хотим сослаться на наше уведомление. Мы используем setTimeout()
чтобы закрыть уведомление по истечении указанного времени. Если при вызове этой функции время не указано, используется значение по умолчанию, равное пяти секундам.
function displayNotification(body, icon, title, link, duration) { link = link || null; // Link is optional duration = duration || 5000; // Default duration is 5 seconds var options = { body: body, icon: icon }; var n = new Notification(title, options); if (link) { n.onclick = function () { window.open(link); }; } setTimeout(n.close.bind(n), duration); }
Теперь давайте checkVersion()
для отображения более информативного уведомления для пользователя.
function checkVersion() { var latestVersion = document.querySelector(".js-currentVersion").textContent; var currentVersion = localStorage.getItem("conciseVersion"); if (currentVersion === null || semverCompare(currentVersion, latestVersion) === -1) { displayNotification( `Click to see what's new in v${latestVersion}`, "http://concisecss.com/images/logo.png", "A new version of Concise is available", `https://github.com/ConciseCSS/concise.css/releases/v${latestVersion}` ); localStorage.setItem("conciseVersion", latestVersion); } }
Мы используем нашу функцию displayNotification
чтобы предоставить описание, изображение, заголовок и ссылку для нашего уведомления.
Примечание: мы используем литералы шаблона ES6 для встраивания выражений в наш текст.
Полный код и тестирование
Ниже вы можете увидеть полный код, который мы написали в этом уроке.
Запуск этого кода должен привести к появлению следующего уведомления в вашем браузере.
Для тестирования вам необходимо ознакомиться с разрешениями уведомлений для вашего браузера. Вот несколько быстрых ссылок для управления уведомлениями в Google Chrome , Safari , FireFox и Microsoft Edge . Кроме того, вы должны быть знакомы с использованием консоли разработчика для удаления и изменения значений localStorage
для удобства тестирования.
Вы можете проверить пример, запустив скрипт один раз и изменив значение HTML-элемента js-currentVersion
чтобы скрипт увидел разницу. Вы также можете перезапустить, используя ту же версию, чтобы подтвердить, что вы не получаете ненужные уведомления.
Продолжая
Это все, что нам нужно для динамических уведомлений браузера! Если вы хотите повысить гибкость уведомлений браузера, я предлагаю ознакомиться с API Service Worker . С помощью сервисных работников можно реагировать на push-уведомления, которые позволяют пользователю получать уведомления независимо от того, посещают ли они в настоящее время ваш сайт или нет, что приводит к более своевременным обновлениям.
Если у вас есть какие-либо вопросы, комментарии или отзывы, не стесняйтесь оставлять их в комментариях ниже. Я также хотел бы видеть любые примеры того, как вы включили уведомления JavaScript в свои проекты.