Куки => запомнить на время сессии
Уважаемые знатаки!
Стоит задача: "Единожды показать некий <div>. В дальнейшем его не показывать пока длится сессия. После закрытия браузера сессия начинаеться снова и весь процесс повторяеться" Неоднократно и без устали пытался написать такой код используя примеры в интернете. В итоге не понял подходит ли COOKIE для таких задач? |
sessionStorage
|
Мой пример:
function lastVisit(){ $.cookie('visit', '0', { path: '/', }); var test = $.cookie('cookie_name'); if(test == 0){ console.log('Одноразовое действие'); test++; } else{ console.log('Действие уже выполнялось, и не возобновиться до начала следующей сессии'); } } lastVisit(); |
cccp.world, если закрыть сайт и открыть вновь, действие вновь выполнится?
|
В документации написано, что: "кука будет храниться лишь до тех пор, пока пользователь не закроет браузер" - Значит действие выполниться.
Возможно я некорректно переопределяю переменную test. Поправте меня |
Цитата:
var visited = sessionStorage.visited; if (visited){ console.log('Действие уже выполнялось, и не возобновиться до начала следующей сессии'); } else { console.log('Одноразовое действие'); sessionStorage.visited = true; } |
Если я все правильно понял ознакомишись с введением sessionStorage по адрессу http://www.nczonline.net/blog/2009/0...essionstorage/. То это расширенная возможность управления сессией на стороне клиента, присущая лишь браузерам с HTML5?
|
Это локальное хранилище, ограниченное по времени длительностью сессии. То есть это тот же самый localStorage, но не такой живучий.
|
Хорошо, завтра буду пробывать. Как попробую отпишусь и если все получиться то, поделюсь ссылкой на ресурс.
|
Цитата:
И вобще, ты так говоришь ("лишь"), будто их мало. На самом деле врядли хоть кто-то из твоих посетителей зайдет с браузера без поддержки sessionStorage. |
<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> |
Вы предложили отличные решения! Решил сначала попробовать классический метод работы с куками:
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=/), поэтому подсунул путь уже так сказать на ходу, через переменную. Как и обещал - делюсь ссылкой Через несколько секунд автоматически появиться приветственное сообщение с фотографией девушки. Повторно оно появиться уже после сброса куки. |
Похоже path отсутствует. Куки будут писаться на каждую страницу.
|
Замечания и правки приветствуются! :thanks:
|
Я о чудесной функции без переносов строк писал выше.
Цитата:
http://www.w3schools.com/js/js_cookies.asp |
OFF. Капец, оказывается js.split() тупо выкидывает что нарезал за борт сверх лимита.
var cols = rows[i].split('=', 2); ожидал в элементе 0 левую часть, в элементе 1 - правую. Х на нэ. |
Цитата:
<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> |
Начал и понял что мне это нафиг не надо, на сервере в стопицот раз проще все сделать. В общем вот такое начало.
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(); // удалили Чтение подразумевалось в массив, то есть кеширование, потом новый кук туда же и все такое. |
Цитата:
На серве просто вставить блок с уникальным id при начала сессии, мон в скрытом виде, а далее пусть скрипт думает, что туда добавить-отнять и открывать блок -аль нет |
Нет, тут другая плоскость. Скажем в куки валятся ид продуктов. Что с ними потом делать? Пихать в where in( --- тут стопицот идех )? А вот если сразу в бд под dummy юзером, то как два пальца: left join orders on blah-blah and user_id = $_SESSION['user_id'] и все остальное тогда работает: и сортировка и фильтрация.
Дело в том что в теме написано про "сессию", а она на сервере, а сервер и без ДжейЭс нажарит печенек и сам их зохавает. :) |
Кстати сессия (вроде упоминали, но не явно) сдохнет только вместе с тредом браузера в памяти. Пока хоть какое-то окно открыто, скажем консоль ошибок или там срачпад - сессия жива.
|
Я немного простыл на прошлой неделе. Провалялся втыкая муви.
Много интересного написали... Спасибо 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 уже является альтернативным способом... |
Про способ я не понял. Орудовать куками из браузера имеет смысл когда надо из браузера что-то сохранять и читать обратно не таскаясь на сервер. Но проблема в том что страницы все равно с сервера загружаются и стало быть если там голимые html тогда да, если нет, тогда за каким?
Как вариант применения. На сервер приходят тухлые куки, а в браузере они свежие всегда. Прочитав куку аяксом можно сейчас передать то, что сервер увидит затем. Но чем больше таких каналов открыто, тем приятнее выкачивать всякие бд и парсить страницы любителям халявки. |
Кстати, потратил полчаса на чтение начала статьи про Evercookie. Как обычно на вике по-русски на интересные вещи статей нет, по-английски читать о том, в чем не разбираешься хуже всего. Вынес мысль: это нам не надо. :)
|
Гы...
Первое дело: Четко сформулировать задачу: "А что-же мне все таки надо!" Из четкой формулировки идёт и четкость решения! |
Вашими устами бы да водку пить. Четкие формулировки даются чрезвычайно трудно и будучи найдены передаются как сокровище в поколения. Это называется поиск решений.
|
На ошибках формируется опыт
|
Часовой пояс GMT +3, время: 01:17. |