Jump to content
  • 0

Показывать блок только 1 раз либо до изменения


smargelov
 Share

Question

Добрый день.

Помогите новичку, пожалуйста. Я в самом начале изучения Javascript вообще и JQuery в частности. Поэтому сам пока не могу осилить.

Итак:

На сайте есть div с id="info". Внутри дива параграф p с каким-то текстом.

Задача, показать этот div пользователю при просмотре сайта с возможностью его закрыть. Если div был закрыт кликом или тапом по иконке сокрытия, больше этот div пользователю не показывать в течении года или до изменения текста внутри параграфа.

Если я правильно всё понимаю, то это выглядит примерно так:

Когда пользователь кликает или тапает на иконку закрытия, JQuery добавляет этому диву класс hide, а плагин JQuery Cookies добавляет кукис со значением = содержимому параграфа. Когда пользователь переходит на другую страницу или перезагружает браузер, функция проверяет наличие и содержание кукиса, и если он есть и совпадает с существующим текстом, то div получает класс hide, в противном случае, всё начинается с начала.

Помогите. Как оформить это в код.

Заранее благодарен.

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

Доброго времени!

Я не намного опытней Вас, так что решение может иметь «детские болезни»: http://jsfiddle.net/SdFba/2/

По умолчанию баннер не отображается, чтобы не «моргать» у уже скрывших его посетителей.

Edited by konfuji
Link to comment
Share on other sites

  • 0

Я не намного опытней Вас, так что решение может иметь «детские болезни»: http://jsfiddle.net/SdFba/2/

Позволю с вами не согласится по поводу опытности, судя по коду. Отдельное спасибо за комментарии (разобрался полностью) и дополнительную плюшку в виде удаления кукисов.

По умолчанию баннер не отображается, чтобы не «моргать» у уже скрывших его посетителей.

Абсолютно правильное решение. Я думал это следующим вопросом разузнать.

Спасибо вам. На мой взгляд — отличная реализация. Буду юзать.

Можно и без плагина — http://jsfiddle.net/hypnocolor/zG7Ad/

Спасибо огромное, но я не настолько силён пока (точнее — откровенно слаб) в JS. Так что пойду от простого к сложному. Ваш код пока не осилю. Стыдно, конечно. Но...

Link to comment
Share on other sites

  • 0

Оказалось, что не всё еще закончилось на этом.

Тут уж точно не могу понять в чём проблема.

Дело в следующем.

Всё, про что я спрашивал, я использую на wordpress сайте.

в header.php вставил вот такой код:


<?php if (have_posts()) : ?>
<?php
global $post;
$args = array( 'numberposts' => 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
<?php the_content(); ?>
<?php endforeach; ?>
<div id="infobox">
<div id="close-button">☒</div>
</div>
<?php else : ?>
<!-- Если не найдено -->
<?php endif; ?>

в footer.php — такой:


<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="<?php bloginfo('template_url'); ?>/js/jquery.cookie.min.js"></script>
<script>
if ($.cookie('viewed_banner') != $('#infobox').text()) {
$('#infobox').show();
$('#close-button').on('click', function() {
$('#infobox').hide();
$.cookie('viewed_banner', $('#infobox').text(), { expires: 365 });
});
}
</script>

Так вот. Когда выводимых постов нет, то на главной ничего не отображается, но на других страницах div'у задаётся displey:block;

Что я делаю не так.

Link to comment
Share on other sites

  • 0

Переделал на вывод в виде виджета. Теперь код в header.php выглядит вот так:


<?php if (!function_exists('dynamic_sidebar') || !dynamic_sidebar('Ads Block')): ?>
<?php endif; ?>

Но насколько я понял, куки сохраняются на одну конкретную страницу. При переходе на другую страницу того же домена они изменяются. Как заставить учитывать куки на всех страницах домена?

Заранее благодарен.

UPD:В общем, ситуация такая. Если закрыть блок на главной, то он не появляется больше нигде по домену, но если закрыть его на внутренней странице, то он не появляется только на этой странице, на остальных же, включая главную, он всё так же отображается.

Как этого избежать?

Edited by smargelov
Link to comment
Share on other sites

  • 0

Если я правильно понимаю, то в куку вы загоняете весь текст, и затем проверяете - не рационально.

на php можно получить сумму хэша контента (если не можете маркер поставить).

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


Если закрыть блок на главной, то он не появляется больше нигде по домену, но если закрыть его на внутренней странице, то он не появляется только на этой странице, на остальных же, включая главную, он всё так же отображается.

можно ссылку на сайт? и посмотрите, что у вас вообще в кукках записанно

Edited by Николя223
Link to comment
Share on other sites

  • 0

Если я правильно понимаю, то в куку вы загоняете весь текст, и затем проверяете - не рационально.

на php можно получить сумму хэша контента (если не можете маркер поставить).

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

Спасибо за совет. Только вот дело в том, что если Javascript я хоть как-то изучаю (начал, по крайней мере), то с PHP вообще беда. Могу готовые куски кода вставить, да лишь на уровне некоторых стандартных функций wordpress. Так что, попробую докопать JS вариант. К тому же, текста там на 1-2 строки. Сильно на производительность не повлияет.

можно ссылку на сайт? и посмотрите, что у вас вообще в кукках записанно

http://timezavod.ru. Текст в куках одинаковый, но вот адрес разный. Как бы заставить их записываться с адресом главной страницы либо как-то допилить код, что бы плагин ориентировался только на содержимом.

UPD: При этом, такая хрень происходит на сайте с ЧПУ. На тестовом сайте (на локальном хосте), там где ЧПУ не включено, всё работает как надо. (((

Edited by smargelov
Link to comment
Share on other sites

  • 0

попробуйте куки вот так ставить:


$.cookie("viewed_banner", "Значение", {
expires: 365,
domain: "timezavod.ru"
});

только предыдущие нужно будет удалить

Edited by Николя223
Link to comment
Share on other sites

  • 0

попробуйте куки вот так ставить:

Попробовал несколько вариантов.


$.cookie('viewed_banner', $('#infobox').text(), { expires: 365, path: "/"});

Вот этот, кажется, заработал так, как нужно.

Спасибо.

Edited by smargelov
Link to comment
Share on other sites

  • 0
Но насколько я понял, куки сохраняются на одну конкретную страницу. При переходе на другую страницу того же домена они изменяются.

Не совсем верно. Для понимания нужно определение атрибута path:

path — путь к директории на сервере, из которой будут доступны cookie. Если задать '/', cookie будут доступны во всем домене. Если задать '/foo/', cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/) домена. По умолчанию значением является текущая директория, в которой cookie устанавливается.

Edited by konfuji
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Seadjus
      Добрый день!
      Огромная просьба камнями не кидаться!
      Начал изучать JS , пока нет особых продвижений в изучении.
      помогите оптимизировать игру в пары. по условиям задания необходимо реализовать игру в пары с таймером, выбором количества карт .
      Ниже
      https://codepen.io/Seadjus/pen/VwVedaP
    • By ilya1203
      Прошу помочь с заданием:
      Написать файл скрипта, который генерирует три числа, соответствующие значениям высоты, длины и ширины комнаты. Отобразить в консоли:
      a.Площадь стен комнаты
      b.Объём комнаты
      c.*Объём комнаты за вычетом случайно сгенерированного количества чисел, которые определяет объёмы случайно зашедших в комнату людей.
      (в итоге запустит скрипт последством консоли)
      (заранее огромное спасибо)
    • By Kaido
      Использую готовый плагин для модальных окон(от MaxGraph). Проблема в том, что когда у меня открыто два модальных окна, для примера Форма + Политика конфендициальности, и мне нужно закрыть политику вместе с ней закрывается и другое модальное окно. В JS я не сильно разбираюсь(собственно из за этого и использую готовый плагин), можете помочь кто работал с этим плагином? Я примерно понимаю как он работает, но реализовать чтобы закрывалось только одно не получается.
       
        <div class="content"> <button class="modal-btn" data-path="first" data-animation="fadeInUp" data-speed="1500">Открыть окно 1</button> </div> <div class="modal"> <div class="modal__wrapp" data-target="first"> <div class="modal__content"> <button class="modal__close">Закрыть</button> модальное окно <button data-path="policy">Политика</button> </div> </div> <div class="modal__wrapp" data-target="policy"> <div class="modal__content"> <button class="modal__close">Закрыть</button> политика </div> </div> </div> .modal { --transition-time: 0.3s; position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 1000; cursor: pointer; overflow-y: auto; overflow-x: hidden; text-align: center; opacity: 0; visibility: hidden; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp { display: none; cursor: default; width: fit-content; height: fit-content; } .modal__content{ position: absolute; left: 500px; width: 500px; height: 500px; display: flex; color: white; flex-direction: column; text-align: left; background-color: #000; } .modal__content button{ width: 200px; height: 50px; margin: 50px 0; } .modal.is-open { opacity: 1; visibility: visible; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp.modal-open { display: flex; } .disable-scroll { position: relative; overflow: hidden; height: 100vh; position: fixed; left: 0; top: 0; width: 100%; } .fade { opacity: 0; transition: opacity var(--transition-time); } .fade.animate-open { opacity: 1; transition: opacity var(--transition-time); } .fadeInUp { opacity: 0; transform: translateY(vw(-100)); transition: opacity var(--transition-time), transform var(--transition-time); } .fadeInUp.animate-open { opacity: 1; transform: translateY(0); transition: opacity var(--transition-time), transform var(--transition-time); } .modal__wrapp[data-target="policy"] .modal__content{ left: 1050px; background-color: #000; opacity: .5; } class Modal { constructor(options) { let defaultOptions = { isOpen: () => {}, isClose: () => {}, } this.options = Object.assign(defaultOptions, options); this.modal = document.querySelector('.modal'); this.speed = false; this.animation = false; this.isOpen = false; this.modalContainer = false; this.previousActiveElement = false; this.fixBlocks = document.querySelectorAll('.fix-block'); this.focusElements = [ 'a[href]', 'input', 'button', 'select', 'textarea', '[tabindex]' ]; this.events(); } events() { if (this.modal) { document.addEventListener('click', function(e){ const clickedElement = e.target.closest('[data-path]'); if (clickedElement) { let target = clickedElement.dataset.path; let animation = clickedElement.dataset.animation; if (clickedElement.classList.contains('modal-close')) { this.close(); } let speed = clickedElement.dataset.speed; this.animation = animation ? animation : 'fade'; this.speed = speed ? parseInt(speed) : 300; this.modalContainer = document.querySelector(`[data-target="${target}"]`); this.open(); return; } if (e.target.closest('.modal__close')) { this.close(); return; } }.bind(this)); window.addEventListener('keydown', function(e) { if (e.keyCode == 27) { if (this.isOpen) { this.close(); } } if (e.keyCode == 9 && this.isOpen) { this.focusCatch(e); return; } }.bind(this)); this.modal.addEventListener('click', function(e) { if (!e.target.classList.contains('modal__wrapp') && !e.target.closest('.modal__wrapp') && this.isOpen) { this.close(); } }.bind(this)); } } open() { this.previousActiveElement = document.activeElement; this.modal.style.setProperty('--transition-time', `${this.speed / 1000}s`); this.modal.classList.add('is-open'); this.disableScroll(); this.modalContainer.classList.add('modal-open'); this.modalContainer.classList.add(this.animation); setTimeout(() => { this.options.isOpen(this); this.modalContainer.classList.add('animate-open'); this.isOpen = true; this.focusTrap(); }, this.speed); } close() { if (this.modalContainer) { this.modalContainer.classList.remove('animate-open'); this.modalContainer.classList.remove(this.animation); this.modal.classList.remove('is-open'); this.modalContainer.classList.remove('modal-open'); this.enableScroll(); this.options.isClose(this); this.isOpen = false; this.focusTrap(); } } focusCatch(e) { const focusable = this.modalContainer.querySelectorAll(this.focusElements); const focusArray = Array.prototype.slice.call(focusable); const focusedIndex = focusArray.indexOf(document.activeElement); if (e.shiftKey && focusedIndex === 0) { focusArray[focusArray.length - 1].focus(); e.preventDefault(); } if (!e.shiftKey && focusedIndex === focusArray.length - 1) { focusArray[0].focus(); e.preventDefault(); } } focusTrap() { const focusable = this.modalContainer.querySelectorAll(this.focusElements); if (this.isOpen) { focusable[0].focus(); } else { this.previousActiveElement.focus(); } } disableScroll() { let pagePosition = window.scrollY; this.lockPadding(); document.body.classList.add('disable-scroll'); document.body.dataset.position = pagePosition; document.body.style.top = -pagePosition + 'px'; } enableScroll() { let pagePosition = parseInt(document.body.dataset.position, 10); this.unlockPadding(); document.body.style.top = 'auto'; document.body.classList.remove('disable-scroll'); window.scroll({ top: pagePosition, left: 0 }); document.body.removeAttribute('data-position'); } lockPadding() { let paddingOffset = window.innerWidth - document.body.offsetWidth + 'px'; this.fixBlocks.forEach((el) => { el.style.paddingRight = paddingOffset; }); document.body.style.paddingRight = paddingOffset; } unlockPadding() { this.fixBlocks.forEach((el) => { el.style.paddingRight = '0px'; }); document.body.style.paddingRight = '0px'; } } const modal = new Modal({ isOpen: (modal) => { console.log(modal); console.log('opened'); }, isClose: () => { console.log('closed'); }, });  
    • By ilyamio
      Здравствуйте. Имеется рабочий скрипт конвертера валют. https://ilyamio.github.io/currencyconverter/
      Мне необходимо изменить источник загрузки курсов на ЦБ РФ вот по этой ссылке: https://www.cbr.ru/scripts/XML_daily.asp
      А также мне необходимо установить ограничение на количество обращений к сайту ЦБ РФ - 1 раз в сутки. При частом обращении, могут заблокировать.
      Вот в этом js файле находятся настройки конвертера:
      const from_currencyEl = document.getElementById('from_currency'); const from_ammountEl = document.getElementById('from_ammount'); const to_currencyEl = document.getElementById('to_currency'); const to_ammountEl = document.getElementById('to_ammount'); const rateEl = document.getElementById('rate'); const exchange = document.getElementById('exchange'); from_currencyEl.addEventListener('change', calculate); from_ammountEl.addEventListener('input', calculate); to_currencyEl.addEventListener('change', calculate); to_ammountEl.addEventListener('input', calculate); exchange.addEventListener('click', () => { const temp = from_currencyEl.value; from_currencyEl.value = to_currencyEl.value; to_currencyEl.value = temp; calculate(); }); function calculate() { const from_currency = from_currencyEl.value; const to_currency = to_currencyEl.value; fetch(`https://api.exchangerate-api.com/v4/latest/${from_currency}`) .then(res => res.json()) .then(res => { const rate = res.rates[to_currency]; rateEl.innerText = `1 ${from_currency} = ${rate} ${to_currency}` to_ammountEl.value = (from_ammountEl.value * rate).toFixed(2); }) } calculate(); Как мне изменить настройки в этом файле чтобы курсы брались с https://www.cbr.ru/scripts/XML_daily.asp и включить ограничение на количество обращений по ссылке cbr.ru - 1 раз в сутки?
      Заранее спасибо всем, кто хотел помочь с решением этой задачи.
    • By vasyl_runner
      $(function () { var mixer = mixitup('.directions__list'); $('.directions__filter-btn').on('click', function () { $('.directions__filter-btn').removeClass('directions__filter-btn--active') $(this).addClass('directions__filter-btn--active') }) })
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy