Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Куки => запомнить на время сессии (https://javascript.ru/forum/events/44923-kuki-%3D-zapomnit-na-vremya-sessii.html)

cccp.world 06.02.2014 19:48

Куки => запомнить на время сессии
 
Уважаемые знатаки!

Стоит задача: "Единожды показать некий <div>. В дальнейшем его не показывать пока длится сессия. После закрытия браузера сессия начинаеться снова и весь процесс повторяеться"

Неоднократно и без устали пытался написать такой код используя примеры в интернете. В итоге не понял подходит ли COOKIE для таких задач?

danik.js 06.02.2014 19:55

sessionStorage

cccp.world 06.02.2014 20:04

Мой пример:
function lastVisit(){
     $.cookie('visit', '0', {
          path: '/',
     });
     var test = $.cookie('cookie_name');
     if(test == 0){
          console.log('Одноразовое действие');
          test++;
     }
     else{
          console.log('Действие уже выполнялось, и не возобновиться до начала следующей сессии');
     }
}
lastVisit();

danik.js 06.02.2014 20:15

cccp.world, если закрыть сайт и открыть вновь, действие вновь выполнится?

cccp.world 06.02.2014 20:20

В документации написано, что: "кука будет храниться лишь до тех пор, пока пользователь не закроет браузер" - Значит действие выполниться.

Возможно я некорректно переопределяю переменную test.

Поправте меня

danik.js 06.02.2014 20:36

Цитата:

Сообщение от cccp.world
Значит действие выполниться.

Ок. Сам с куками не дружу. Есть более удобный способ:

var visited = sessionStorage.visited;
if (visited){
  console.log('Действие уже выполнялось, и не возобновиться до начала следующей сессии');
} else {
  console.log('Одноразовое действие');
  sessionStorage.visited = true;
}

cccp.world 06.02.2014 20:50

Если я все правильно понял ознакомишись с введением sessionStorage по адрессу http://www.nczonline.net/blog/2009/0...essionstorage/. То это расширенная возможность управления сессией на стороне клиента, присущая лишь браузерам с HTML5?

danik.js 06.02.2014 20:52

Это локальное хранилище, ограниченное по времени длительностью сессии. То есть это тот же самый localStorage, но не такой живучий.

cccp.world 06.02.2014 20:57

Хорошо, завтра буду пробывать. Как попробую отпишусь и если все получиться то, поделюсь ссылкой на ресурс.

danik.js 06.02.2014 21:12

Цитата:

Сообщение от cccp.world
присущая лишь браузерам с HTML5?

А разве IE8, поддерживающий sessionStorage, поддерживает HTML5?
И вобще, ты так говоришь ("лишь"), будто их мало. На самом деле врядли хоть кто-то из твоих посетителей зайдет с браузера без поддержки sessionStorage.

Deff 07.02.2014 03:40

<div id="show" style="display:none">Привет вновь Вошедшим!</div>
<script type="text/javascript">
function setcOOkie(a,b,c) {if(c){var d = new Date();d.setDate(d.getDate()+c);}if(a && b) document.cookie = a+'='+ encodeURIComponent(b) +(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] ? decodeURIComponent(c[1]) : false;}

var test = getcOOkie('show');
if(!test){
  alert("Куки нет, - Открываю div");
  setcOOkie('show',1) ;
  document.getElementById('show').style.display="block";
}
</script>

cccp.world 07.02.2014 09:00

Вы предложили отличные решения! Решил сначала попробовать классический метод работы с куками:

function lastVisit(){
	function setcOOkie(a,b,c) {
		if(c){
			var d = new Date();
			d.setDate(d.getDate()+c);
			var path = '7day-7kg.net';
			console.log(path);
		}
		if(a && b) document.cookie = a+'='+ (encodeURIComponent(b)).replace('', 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] ? decodeURIComponent(c[1]) : false;
	}
	var test = getcOOkie('show');
	if(!test){
		console.log("Куки нет, - Открываю div");
		setcOOkie('show',1) ;
		setTimeout(function() {
		jQuery('#popUp').stop();
			jQuery('#popUp').fadeIn(600);
		}, 3000);
	}
        else{
		console.log("Куки уже есть, - div не отрываю");
	}
}
lastVisit();


Следует отметить, что комментарии отсутствуют. На форумах почему - то все как - то поверхностно описывается. Толком так и не разобрался как работать с куками.
Отсюда: Не знал куда грамотна подсунуть путь к кукам (path=/), поэтому подсунул путь уже так сказать на ходу, через переменную.
Как и обещал - делюсь ссылкой Через несколько секунд автоматически появиться приветственное сообщение с фотографией девушки. Повторно оно появиться уже после сброса куки.

kostyanet 07.02.2014 09:08

Похоже path отсутствует. Куки будут писаться на каждую страницу.

cccp.world 07.02.2014 09:15

Замечания и правки приветствуются! :thanks:

kostyanet 07.02.2014 09:49

Я о чудесной функции без переносов строк писал выше.

Цитата:

Сообщение от cccp.world
На форумах почему - то все как - то поверхностно описывается.

Потому что подробно описано в мануале, например в самом попсовом:

http://www.w3schools.com/js/js_cookies.asp

kostyanet 07.02.2014 10:08

OFF. Капец, оказывается js.split() тупо выкидывает что нарезал за борт сверх лимита.

var cols = rows[i].split('=', 2);

ожидал в элементе 0 левую часть, в элементе 1 - правую. Х на нэ.

Deff 07.02.2014 16:31

Цитата:

Сообщение от kostyanet (Сообщение 296463)
Похоже path отсутствует. Куки будут писаться на каждую страницу.

Добавил
<div id="show" style="display:none">Привет вновь Вошедшим!</div>
<script type="text/javascript">
function setcOOkie(a,b,c) {if(c){var d = new Date();d.setDate(d.getDate()+c);}if(a && b) document.cookie = a+'='+ encodeURIComponent(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] ? decodeURIComponent(c[1]) : false;}

var test = getcOOkie('show');
if(!test){
  alert("Куки нет, - Открываю div");
  setcOOkie('show',1) ;
  document.getElementById('show').style.display="block";
}
</script>

kostyanet 07.02.2014 19:46

Начал и понял что мне это нафиг не надо, на сервере в стопицот раз проще все сделать. В общем вот такое начало.

var cookie = function() {

		return {
		'name':null,
		'value':null,
		'domain':'.'+location.hostname.replace('www.',''),
		'path':'/',
		'expires': function(days) {

            if(this.value) {

                var expire=function(days) {
					days = days || 30;
					var d = new Date();
					d.setTime(d.getTime()+(days*24*60*60*1000));
					return d.toGMTString();
				};

    			var res=[];    			
    			res.push(this.name+'='+this.value);
    			res.push('domain='+this.domain);
    			res.push('path='+this.path);
    			res.push('expires='+expire(days));
    			res = res.join(';');
    
            }
            else
               var res = this.name+'=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
		console.log(res);
		// document.cookie=res;

		}
		};

	};


var c = new cookie();
c.name = 'user';
c.value='Vasya';
c.expires(7); // записали

c.name = 'user';
c.value=null;
c.expires(); // удалили

Чтение подразумевалось в массив, то есть кеширование, потом новый кук туда же и все такое.

Deff 07.02.2014 20:09

Цитата:

Сообщение от kostyanet
и понял что мне это нафиг не надо, на сервере в стопицот раз проще все сделать.

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

На серве просто вставить блок с уникальным id при начала сессии, мон в скрытом виде, а далее пусть скрипт думает, что туда добавить-отнять и открывать блок -аль нет

kostyanet 08.02.2014 09:31

Нет, тут другая плоскость. Скажем в куки валятся ид продуктов. Что с ними потом делать? Пихать в where in( --- тут стопицот идех )? А вот если сразу в бд под dummy юзером, то как два пальца: left join orders on blah-blah and user_id = $_SESSION['user_id'] и все остальное тогда работает: и сортировка и фильтрация.

Дело в том что в теме написано про "сессию", а она на сервере, а сервер и без ДжейЭс нажарит печенек и сам их зохавает. :)

kostyanet 08.02.2014 09:34

Кстати сессия (вроде упоминали, но не явно) сдохнет только вместе с тредом браузера в памяти. Пока хоть какое-то окно открыто, скажем консоль ошибок или там срачпад - сессия жива.

cccp.world 14.02.2014 06:17

Я немного простыл на прошлой неделе. Провалялся втыкая муви.
Много интересного написали...
Спасибо Deff за новые правки.

Исправил строчку:
if(a && b) document.cookie = a+'='+ (encodeURIComponent(b)).replace('', path) +(c ? '; expires='+d.toUTCString() : '');
на
if(a && b) document.cookie = a+'='+ encodeURIComponent(b) +';path=/'+(c ? '; expires='+d.toUTCString() : '');
Теперь куки пишутся в корень. Посмотреть всплывавшку можно тут.
Как заметил kostyanet:"Начал и понял что мне это нафиг не надо, на сервере в стопицот раз проще все сделать.". Соглашусь. Однако session тоже использует куки браузера. Как я понял хранение информации в куки непосредственно через javascript уже является альтернативным способом...

kostyanet 16.02.2014 23:17

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

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

Но чем больше таких каналов открыто, тем приятнее выкачивать всякие бд и парсить страницы любителям халявки.

kostyanet 16.02.2014 23:19

Кстати, потратил полчаса на чтение начала статьи про Evercookie. Как обычно на вике по-русски на интересные вещи статей нет, по-английски читать о том, в чем не разбираешься хуже всего. Вынес мысль: это нам не надо. :)

Deff 16.02.2014 23:38

Гы...
Первое дело: Четко сформулировать задачу: "А что-же мне все таки надо!"
Из четкой формулировки идёт и четкость решения!

kostyanet 17.02.2014 04:23

Вашими устами бы да водку пить. Четкие формулировки даются чрезвычайно трудно и будучи найдены передаются как сокровище в поколения. Это называется поиск решений.

cccp.world 23.02.2014 13:33

На ошибках формируется опыт


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