Как сделать предупреждение об использовании cookie на сайте без плагина (используя локальное хранилище)
Привет всем, у кого есть свой сайт. Вы, скорее всего, знаете, что если у вас есть сайт, то он постоянно требует каких-то доработок и улучшений. То закон какой-то новый выйдет, то в SEO что-то изменится и так далее. Сегодня я покажу вам простой способ, как можно добавить на сайт предупреждение об использовании cookie без использования плагинов.
Конечно же, если у вас сайт на какой-то популярной платформе типа WordPress, то для предупреждения об использовании cookie можно установить любой из огромного количества плагинов, которые сделают всю работу за вас. Однако опытные вебмастера прекрасно знают, что чем больше на сайте плагинов, тем медленнее он работает, а это уже напрямую влияет на SEO. Поэтому если вы хоть немного понимаете код (CSS, JS, HTML), то лучше всего сделать предупреждение об использовании Cookie своими руками.
Все ли сайты используют Cookie
Этим вопросом задаются многие владельцы сайтов. Ответ очень простой – почти со 100% вероятностью ДА. Исключением могут быть только сайты, на которых нет вообще ничего, кроме текстового контента: ни счетчиков посещаемости, ни рекламы, ни форм обратной связи и так далее. В общем, если у вас хоть сколько-нибудь нормальное подобие современного сайта, то предупредить об использовании Cookie вы просто обязаны.
Почему я использовал Local Storage при написании предупреждения
Честно вам скажу, перед тем, как сделать такое предупреждение на своем сайте, я просмотрел несколько похожих статей с готовыми решениями. Но они мне не понравились. Объясняю чем. Во всех решениях были использованы cookie для работы этого функционала. Оно и не сильно странно, и даже логично. Но сейчас есть решение гораздо более удобное и простое – локальное хранилище браузера (local storage).
Работа локального хранилища очень похожа на работу cookie, но есть существенные отличия.
- Каждый раз, когда что-то записывается в cookie (или стирается оттуда), то эта информация отправляется на сервер. А это дополнительная нагрузка на сервер. А если вы обрабатываете cookie сервером, а не клиентской частью, то это еще и дополнительные задержки времени. Local Storage же в отличие от Cookie никуда дальше браузера пользователя не уходит и хранится только там.
- С локальным хранилищем удобнее работать, так как это самый обыкновенный объект. Cookie же представляют собой строку, которую постоянно приходится распарсивать, использовать регулярки или подключать дополнительный библиотеки для удобной работы с Cookie. А дополнительные библиотеки опять же негативно влияют на скорость работы вашего сайта.
Вот и во всех примерах, которые я находил в интернете для работы с cookie используют библиотеку jQuery да еще и с дополнительной мини библиотекой, которая позволят jQuery удобнее работать с кукисами. Есть примеры кода и на чистом Java Script, но они, как правило, очень громоздкие и неудобные.
Как я сделал предупреждение об использовании cookie на сайте без плагина
Код будет состоять из трех частей. Первый кусок – html разметка. Его нужно поместить куда-то в футер вашего сайта (в самый низ). Если у вас сайт на CMS, то ищите у него в корне шаблона файл footer.php. Если у вас какой-то простенький одностраничный сайт, то в самом низу найдите тег <footer></footer>. Внутри него обязательно будет еще какой-то код. Нет большой разницы, куда именно вы поместите наш код, но я бы советовал в самом конце этого тега, как раз перед </footer>.
<div id="cookie_notification"> <p>Для улучшения работы сайта и его взаимодействия с пользователями мы используем файлы cookie. Продолжая работу с сайтом, Вы разрешаете использование cookie-файлов. Вы всегда можете отключить файлы cookie в настройках Вашего браузера.</p> <button class="button cookie_accept">Принять</button> </div>
Второй кусок – стили (CSS). Тут все просто. Вам нужно найти файл style.css или main.css и закинуть этот код в самый конец. Теперь ваше «предупреждение» должно выглядеть красиво и стильно, но… но на самом деле вы его не увидите вообще, пока не добавить код Java Script. Кстати стили я написал сразу адаптивными, чтобы ваше предупреждение об использовании Cookie выглядело ровно и адекватно не только на компьютерах, но также и на мобильных устройствах.
#cookie_notification{ display: none; justify-content: space-between; align-items: flex-end; position: fixed; bottom: 15px; left: 50%; width: 900px; max-width: 90%; transform: translateX(-50%); padding: 25px; background-color: white; border-radius: 4px; box-shadow: 2px 3px 10px rgba(0, 0, 0, 0.4); } #cookie_notification p{ margin: 0; font-size: 0.7rem; text-align: left; color: $color_text; } @media (min-width: 576px){ #cookie_notification.show{ display: flex; } .cookie_accept{ margin: 0 0 0 25px; } } @media (max-width: 575px){ #cookie_notification.show{ display: block; text-align: left; } .cookie_accept{ margin: 10px 0 0 0; } }
Третья часть – JS (Java Script) – самое вкусное во всем это творении. Как раз тут я использовал локальное хранилище браузера – быстрое, удобное, доступное. Код со скриптами вам нужно добавить в основной скриптовый файл (если у вас их несколько), который срабатывает абсолютно на всех страницах сайта.
function checkCookies(){ let cookieDate = localStorage.getItem('cookieDate'); let cookieNotification = document.getElementById('cookie_notification'); let cookieBtn = cookieNotification.querySelector('.cookie_accept'); // Если записи про кукисы нет или она просрочена на 1 год, то показываем информацию про кукисы if( !cookieDate || (+cookieDate + 31536000000) < Date.now() ){ cookieNotification.classList.add('show'); } // При клике на кнопку, в локальное хранилище записывается текущая дата в системе UNIX cookieBtn.addEventListener('click', function(){ localStorage.setItem( 'cookieDate', Date.now() ); cookieNotification.classList.remove('show'); }) } checkCookies();
Когда вы все закончите, то вот, как у вас будет это выглядеть:
Как работает предупреждение об использование Cookie, которое я сделал
Да, для большинства из вас этот пункт, наверное, будет неинтересен. Вы просто вставите код, все заработает, и вы мысленно скажете мне спасибо. Но для тех из вас, кому интересно разобраться подробнее, я объясню некоторые ключевые моменты скрипта.
При каждой загрузке страницы выполняется коротенькая функция, которая проверяет объект Local Storage по ключу «cookieDate». Значение этого ключа по моей задумке будет какая-то дата в системе UNIX (точнее дата соглашения отдельного пользователя с тем, что ваш сайт использует cookie).
UNIX время — это количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (источник — википедия)
Если прошло уже больше года с момента, когда мы показывали пользователю предупреждение, то есть если дата была получена по ключу и она на год (точнее, на 31536000000 миллисекунд) меньше текущей даты — мы показываем предупреждение, добавив ему класс «.show».
Также мы показываем это предупреждение в случае, если указанного ключа вообще не было в локальном хранилище. Это означает, что человек на нашем сайте впервые.
В противном случае мы ничего не делаем, и пользователь просто не видит предупреждение, потому что по умолчанию оно у нас скрыто, насколько вы помните.
Вывод
Надеюсь, я смог помочь решить вашу проблему, и теперь вы знаете, как сделать на своем сайте предупреждение об использовании Cookie. Если у вас остались какие-то вопросы по поводу использования этого кода, то смело задавайте их в комментариях.
Кстати, если вы знаете, почему традиционно предупреждение о Cookie пишут с использованием самих же Cookie, а не Local Storage, сообщите мне, пожалуйста, об этом. Вдруг я делаю что-то не так. Хотя чисто технически код выполняет именно то, чего от него ждут.
Всем спасибо за внимание.
Друзья, если вы заметили на сайте какой-нибудь баг, то напишите об этом в комментариях или отправьте сообщение на почту через контакты, и мы его исправим.
А также мы будем рады услышать ваши пожелания, если вам по какой-то причине неудобно пользоваться сайтом.
Не будьте равнодушными к проекту. Спасибо! :-)
Доброго времени суток!
— вставил DIV с кодом в конец страницы
— CSS и JS сделал отдельными файлами и подключил их в HEAD
Итог — не работает. Что я сделал не так? )))
Сайт: medic.lightideas.studio
Заранее очень Вам благодарен за помощь и советы!
Здравствуйте.
Попробуйте переместить скрипт ниже вашего DIV. Либо прописать скрипту атрибут defer.
Добрый день!
Подскажите пожалуйста как правильно разместить на сайте (HTML) эти скрипты. Какие имена присвоить *.css и *.js? В какие папки их сохранить в pages или корневой каталог?
Добрый вечер. Имена файлов можете любые использовать, лишь бы вам понятно было, что эти файлы у вас отвечают за куки. Например вполне нормальный вариант — cookie.css и cookie.js. А еще лучше вставить эти стили и скрипты в свои общие файлы. Директории выбирайте согласно вашей файловой структуре на проекте. Посмотрите, где у вас лежат остальные файлы.
Мне кажется, лучше чтобы по умолчанию показывалось, а если есть пометка, то скрывать. (Чтобы если отключён Javascript, предупреждение всё равно показывалось)
Я думаю разница не велика. Вы описываете какой-то крайний случай. К тому же, если у чела отключен JS, то ему придется вручную скрывать это уведомление каждый раз, когда он перейдет на новую страницу.
Для работы нужно или вставлять js ниже уведомления или использовать defer (или иной способ запуска после загрузки уведомления)
иначе document.getElementById(‘cookie_notification’) вернёт null,и при выполнении cookieNotification.classList… возникнет ошибка, и уведомление не появится.
Uncaught TypeError: Cannot read properties of null (reading ‘querySelector’)
at checkCookies (footer.js:23:40)
at footer.js:36:1
Вообще-то у вас на сайте все скрипты должны срабатывать после события «DOMContentLoaded». Тогда не будет описанных вами проблем.
Здравствуйте!
Спасибо за интересные мысли и идею. Для меня — чем проще код, тем лучше.
Мне кажется, что в коде ошибка и указанное в Java Scriptе UNIX время 31536000000 секунд на 3 порядка больше 1 года, т.е. эта цифра соответсвует 1000 годам и это предупреждение по второму разу не увидит ни один пользователь сайта 🙂
Если я прав, исправте пожалуйста.
Добрый день.
31536000000 это миллисекунды, а не секунды 😉
Здравствуйте!
У меня почему-то не срабатывает хранение куки на год. В сессии работает, а после закрытия браузера опять выскакивает окно. На вашем сайте сработало. В чем может быть дело?
Добрый день.
Возможно вы используете session storage вместо local storage.
Еще одна возможная причина — у вас установлен какой-нибудь чистильщик в браузере или на компьютере.
Это первое что приходит на ум. А так причин может быть много конечно и часто не очевидных.
Здравствуйте! Подскажите пожалуйста, как реализовать ваш код на одночастичном сайте? Разместил код в index.htm появился текст на странице, потом разместил ваш код в style.css. Соответственно текст пропал, далее разместил код JS, но окно предупреждения о куках не появилось. На других сайтах работает! Подскажите пожалуйста мою ошибку? Скорее всего JS неправильно подключил.
Может вы не заметили, как случайно нажали на кнопку и теперь увидите эту плашку через год.
Попробуйте открыть свой сайт через режим инкогнито в браузере или попробуйте почистить куки.
Здравствуйте! Столкнулся с проблемой, при добавлении JS в файл functions.php. Сайт становится не доступный, а синтаксис ошибке указывает на unexpected ‘cookieDate’ (T_STRING) in. Код вставляю перед ?>
В чем может быть проблема?
Лучше, конечно, подключать скрипты отдельным файлом. В вашей ситуации нужно закрывать php тег, вставлять скрипт, а потом снова открывать
Готовые коды это прикольно, вод бы еще понимать куда их вставлять. Вставлял коды как описано в статье не сработало. Первый код вставил в файл footer.php перед . Второй код со стилями вставил в файл style.css в самом конце. Третий скрипт вставлял во все файлы, которые были в формате js.
Ну в целом вы все правильно сделали. Только последний код нужно было вставлять не во все подряд js файлы, а только в тот, который у вас подключается на всех страницах.
Но у вас там вообще проблема с подключенными стилями и скриптами — одни и те же файлы подключены по несколько раз.