Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как присвоить класс элементу после проверки cookies (https://javascript.ru/forum/jquery/42132-kak-prisvoit-klass-ehlementu-posle-proverki-cookies.html)

BETEPAH 14.10.2013 20:34

http://learn.javascript.ru/comparison
Цитата:

Значения null и undefined равны == друг другу и не равны чему бы то ни было ещё.
Это жёсткое правило буквально прописано в спецификации языка.
Как-то так предлагаю:
$(document).ready(function () {
	 if(!getCookie('iWas')) {
		setTimeout( function(){
			document.getElementById('popup').style.display='block';
			setCookie('iWas', 'here');
		} , 1000);
	};
});

функции getCookie и setCookie не расшифровываю для краткости. Можете написать свои, можете использовать эти, например http://learn.javascript.ru/cookie

ksa 14.10.2013 21:04

Так и не пойму, зачем эти танцы с куками если есть серверный язык и сессия (читай сеанс)...

Round 14.10.2013 22:05

BETEPAH,

Спасибо за помощь, работает.

Все протестил и все отлично.

Но вылезла одна загвоздка. Все работает безупречно на локалхосте. А когда перенес на сервер, работать перестало.

Путем перебора 1000 отличий - нашел что на это как то влияет строчка которая подключается выше чем подключается jquery.cookies. Это строчка: <script type="text/javascript" async="" src="http://www.google-analytics.com/ga.js" style=""></script>

Может это быть причиной и какова природа этого?

Я вижу два варианта - как то перенести эту строчку ниже, или (чего не хочется) отказаться от этого аналитикса вообще.

Есть другие варианты?

BETEPAH 14.10.2013 22:16

Round,
сделайте на сервере тестовую страницу, на которой код будет работать неадекватно и дайте, пожалуйста, сюда ссылку.

Deff 14.10.2013 22:17

function setcookie(a,b,c) {if(c){var d = new Date();d.setTime(d.getTime()+c);}if(a && b) document.cookie = a+'='+b+';path=/'+(c ? '; expires='+d.toUTCString() : '');else return false;}
 function getcookie(a) {var b = new RegExp(a+'=([^;]){1,}');var c = b.exec(document.cookie);if(c) c = c[0].split('=');else return false;return c[1] ? c[1] : false;}
//ставим кук на сессию
setcookie('first_visit',true);
var first_visit = getcookie('first_visit');
if(first_visit) alert('"first_visit" - Кук есть')


function setcookie(a,b,c) {if(c){var d = new Date();d.setTime(d.getTime()+c);}if(a && b) document.cookie = a+'='+b+';path=/'+(c ? '; expires='+d.toUTCString() : '');else return false;}
 function getcookie(a) {var b = new RegExp(a+'=([^;]){1,}');var c = b.exec(document.cookie);if(c) c = c[0].split('=');else return false;return c[1] ? c[1] : false;}
//Проверяем установленное предыдущим скриптом
var first_visit = getcookie('first_visit');
if(first_visit) alert('"first_visit" - Кук есть')

Round 16.10.2013 08:50

Deff,

Спасибо за ещё один вариант.

BETEPAH,

Вчера весь день возился с этим глюком. Перенести этот гугланалитикс не вышло и убрать его нельзя, он мне нужен.

В итоге, я поменял код обработки куков но результат остался тот же - на локалхосте работает, а на сервере глючит.

Вот ссылка на главную страницу, на которой этот попап: http://hostultimo.com/preview/c/oxen/

Возможно, можно какой то костыль поставить?

Сейчас попап появляется на пару секунд и пропадает, если зайти повторно.

Новый код выглядит вот так:

// 'Delete' cookie for testing
function deleteCookie()
{
if(typeof(Storage) !== "undefined"){
    sessionStorage.returnVisit = "false";
    console.log("sessionStorage set.");
}
else{
    setCookie("return_visit","false",1);
}
}

//W3 Schools setCookie function
function setCookie(c_name,value,exdays)
{
  var exdate=new Date();
  exdate.setDate(exdate.getDate() + exdays);
  var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
  document.cookie = c_name + "=" + c_value;
}

//W3 Schools getCookie function
function getCookie(c_name)
{
  var c_value = document.cookie;
  var c_start = c_value.indexOf(" " + c_name + "=");
  if (c_start == -1)
  {
    c_start = c_value.indexOf(c_name + "=");
  }
  if (c_start == -1)
  {
    c_value = null;
  }
  else
  {
    c_start = c_value.indexOf("=", c_start) + 1;
    var c_end = c_value.indexOf(";", c_start);
    if (c_end == -1)
    {
      c_end = c_value.length;
    }
  c_value = unescape(c_value.substring(c_start,c_end));
 }
return c_value;
}

//Check return_visit cookie on page load
function bodyOnload()
{
if(getCookie("return_visit") === 'true' || sessionStorage.returnVisit === "true"){
    //Do something if user has already visited page
            var test = document.getElementById("test");
    test.style.display = "none";
}
else
{
    if(typeof(Storage) !== "undefined"){
        sessionStorage.returnVisit = "true";
        console.log('Session Storage set.');
    }
    else{
        setCookie("return_visit","true",1);
    }
}
}


$(document).ready(function () {

	var delay_popup = 1000;
	setTimeout("document.getElementById('parent_popup').style.display='block'", delay_popup);
	
 });


А попап обернул ещё раз.

<div id="test">

<div id="parent_popup" class="popup-slider">
<div id="popup">

	<?php if(function_exists('show_flexslider_rotator')) echo show_flexslider_rotator( 'popup' );?>

<a class="close_popup" title="Close" onclick="document.getElementById('parent_popup').style.display='none';">CLOSE X</a>

  </div>
</div>

</div>

BETEPAH 16.10.2013 10:09

Цитата:

Сообщение от Round
на локалхосте работает

Странно. Не понимаю, как может работать такой код:
// 'Delete' cookie for testing
function deleteCookie()
{
if(typeof(Storage) !== "undefined"){
    sessionStorage.returnVisit = "false";
    console.log("sessionStorage set.");
}
else{
    setCookie("return_visit","false",1);
}
}

//W3 Schools setCookie function
function setCookie(c_name,value,exdays)
{
  var exdate=new Date();
  exdate.setDate(exdate.getDate() + exdays);
  var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
  document.cookie = c_name + "=" + c_value;
}

//W3 Schools getCookie function
function getCookie(c_name)
{
  var c_value = document.cookie;
  var c_start = c_value.indexOf(" " + c_name + "=");
  if (c_start == -1)
  {
    c_start = c_value.indexOf(c_name + "=");
  }
  if (c_start == -1)
  {
    c_value = null;
  }
  else
  {
    c_start = c_value.indexOf("=", c_start) + 1;
    var c_end = c_value.indexOf(";", c_start);
    if (c_end == -1)
    {
      c_end = c_value.length;
    }
  c_value = unescape(c_value.substring(c_start,c_end));
 }
return c_value;
}

//Check return_visit cookie on page load
function bodyOnload()
{
if(getCookie("return_visit") === 'true' || sessionStorage.returnVisit === "true"){
    //Do something if user has already visited page
            var test = document.getElementById("test");
    test.style.display = "none";
}
else
{
    if(typeof(Storage) !== "undefined"){
        sessionStorage.returnVisit = "true";
        console.log('Session Storage set.');
    }
    else{
        setCookie("return_visit","true",1);
    }
}
}


$(document).ready(function () {

	var delay_popup = 1000;
	setTimeout("document.getElementById('parent_popup').style.display='block'", delay_popup);
	
 });
Во-первых, куки вы выставляете не сессионные, а на 1 день. Во-вторых, вы при загрузке страницы запускаете таймер, который через одну секунду должен показать попап, и тут же делаете проверку наличия куки? Зачем? Я же привел выше код. Сначала делайте проверку, а потом запускайте таймер попапа, если есть необходимость

Round 16.10.2013 10:16

Я согласен, с тем что там сейчас много каши... Но это пока что тестовый вариант и я его всячески мучаю, по этому там могут быть накладки. Все замечания по ошибкам я принимаю с благодарностью. :thanks:

Да, и там ещё была кнопка которой я сбрасывал куки, что бы каждый раз не переоткрывать окно браузера.

BETEPAH 16.10.2013 10:27

Цитата:

Сообщение от Round
Сейчас попап появляется на пару секунд и пропадает, если зайти повторно.

ну, правильно. Потому что сначала срабатывает $(document).ready(function (), в которой прописан запуск попапа через секунду, а затем, после загрузки всего содержимого страницы (включая картинки), срабатывает body.onload, в котором этот попап прикрывается.
Переделайте логику скрипта. Сделайте так, как я написал выше - сначала проверка, затем вызов

Round 16.10.2013 10:50

BETEPAH,

ага, я наверное перегрелся и протупил с этим моментом...

Цитата:

ну, правильно. Потому что сначала срабатывает $(document).ready(function (), в которой прописан запуск попапа через секунду, а затем, после загрузки всего содержимого страницы (включая картинки), срабатывает body.onload, в котором этот попап прикрывается.
Сейчас переделаю.


Часовой пояс GMT +3, время: 09:18.