Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   работа document.cookie (https://javascript.ru/forum/misc/64450-rabota-document-cookie.html)

porezon 12.08.2016 01:18

работа document.cookie
 
Здравствуйте!

Есть код

$(function() {
$left = $(".leftname2"), $contex = $(".contextlink0");
$left.on("click", function() {
$left.not($(this).addClass("active")).removeClass("active");
var i = $left.index(this);
$contex.not($contex.eq(i).show()).hide();
if(id == "page1"){document.cookie="m_sf1=1; path=/;";}
if(id == "page2"){document.cookie="m_sf1=2; path=/;";}
if(id == "page3"){document.cookie="m_sf1=3; path=/;";}
})
});


<div class="leftname2 active" onclick="show('page1');return false;">Новые</div><div class="leftname2" onclick="show('page2');return false;">Обсуждаемые</div><div class="leftname2" onclick="show('page3'); return false;">Интересные</div>
</div>
<div class='menuleft'>
<div id="page1" class="contextlink0">
<div class="com_line"><a href="/forum_topic_view.php?gr=27">Анекдоты</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=5'>potapows</a><span class="font10"><span class='forum-posts4' title='Просмотров'>7 Августа 2016 в 20:51</span></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=3">Новый буксик</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=3'>Добрый</a><span class="font10"><span class='forum-posts4' title='Просмотров'>26 Июля 2016 в 20:32</span></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=2">Правила проекта</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts4' title='Просмотров'>25 Июля 2016 в 19:03</span></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=1">Мы открылись!</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts4' title='Просмотров'>25 Июля 2016 в 19:01</span></span></div></div>
</div>

<div id="page2" class="contextlink0">
<div class="com_line"><a href="/forum_topic_view.php?gr=2">Правила проекта</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts3' title='Комментариев'>27</span><a href="/forum_topic_view.php?gr=2"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=3">Новый буксик</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=3'>Добрый</a><span class="font10"><span class='forum-posts3' title='Комментариев'>25</span><a href="/forum_topic_view.php?gr=3"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=27">Анекдоты</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=5'>potapows</a><span class="font10"><span class='forum-posts3' title='Комментариев'>23</span><a href="/forum_topic_view.php?gr=27"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=1">Мы открылись!</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts3' title='Комментариев'>1</span><a href="/forum_topic_view.php?gr=1"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
</div>
<div id="page3" class="contextlink0">
<div class="com_line"><a href="/forum_topic_view.php?gr=3">Новый буксик</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=3'>Добрый</a><span class="font10"><span class='forum-posts2' title='Просмотров'>879</span><a href="/forum_topic_view.php?gr=3"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=2">Правила проекта</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts2' title='Просмотров'>493</span><a href="/forum_topic_view.php?gr=2"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=1">Мы открылись!</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=1'>Winko.Ru</a><span class="font10"><span class='forum-posts2' title='Просмотров'>298</span><a href="/forum_topic_view.php?gr=1"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
<div class="com_line"><a href="/forum_topic_view.php?gr=27">Анекдоты</a></div>
<div class="com_details"><div class='font12'><a href='/userinfo.php?str=5'>potapows</a><span class="font10"><span class='forum-posts2' title='Просмотров'>201</span><a href="/forum_topic_view.php?gr=27"><span class='comment-answer'>&nbsp;</span>Ответить</a></span></div></div>
</div>


он открываем вкладки, хочу сделать чтоб запомнил какую вкладку, открыл но не сохраняет

на php вывожу вот так
<? echo $_COOKIE['m_sf1'];?>

warren buffet 12.08.2016 05:41

Сначала вместо этой лапши

if(id == "page1"){document.cookie="m_sf1=1; path=/;";}
if(id == "page2"){document.cookie="m_sf1=2; path=/;";}
if(id == "page3"){document.cookie="m_sf1=3; path=/;";}


напиши одну строку

document.cookie='m_sf1='+id+'; path=/;';


Как записывается кука на жабе я не знаю, считаем что ты правильно записываешь, то есть в куке m_sf1 будет page1, или page2 и так далее, что полезнее, поскольку page1, page2, и так далее - это готовые id, как и следует из кода записи. В куку можно записать 4096 байт, так что на page1 хватит.

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

Цитата:

на php вывожу вот так
<? echo $_COOKIE['m_sf1'];?>
Ну получишь где-то в коде циферку и все.

laimas 12.08.2016 05:55

Цитата:

Сообщение от warren buffet
Ну получишь где-то в коде циферку и все.

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

warren buffet 12.08.2016 05:57

Посмотрел твой "есть код", которого там не должно быть вообще. У тебя где-то есть функция show(id){}; судя по onclick="show('page1');return false;" Так ты ее и наполни фаршем.

function show(id){

   var ckey='m_sf1';

   /*
    если id не определено, 
    то делается попытка получить его из кук 
    если и там нет, то по умолчанию page1
    и новое (или старое) id сразу же сохраняется
    */

   if(!id) id = Cookie.load(ckey) || 'page1';
   Cookie.save(ckey,id);

    /* тут вся твоя лапша */

   return false;

}



и тогда

onclick="return show('page1');"

И где-нибудь на загрузке страницы пишешь

show();

без аргументов.

ЗЫ Cookie.load и Cookie.save - это абстракция. Заменяй на свои коды записи чтения куки.

warren buffet 12.08.2016 06:02

Цитата:

Сообщение от laimas
Он ее никогда не получит на сервере

У него же jquery, неужели в этой лайбе не предусмотрены гуманные методы чтения-записи кук?

warren buffet 12.08.2016 06:08

Не предусмотрено блин, офигеть, еще и плугин нужен, оборзели. Короче, вот так должно работать

var Cookie={
	save: function(key, value) {
		document.cookie = key + '=' + value + '; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/';
	},
	load: function (key) {
		var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
		return keyValue ? keyValue[2] : null;
	}
	
};


Хотя вроде бы все имена и значения должны быть в кавычках. Хз.

porezon 12.08.2016 11:10

я не сильно разбираюсь, можно готовый код?

porezon 12.08.2016 15:38

ктонибудь поможет?

laimas 13.08.2016 00:43

Цитата:

Сообщение от porezon
ктонибудь поможет?

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

Сначала прочесть о параметрах кук. Если так затруднительно их устанавливать/проверять посредством document.cookie можете использовать плагин для jQuery.

А ваш JS-сценарий должен выполнять следующее - при загрузке страницы проверять установлена ли кука с нужным именем, и если да, то открыть вкладку в ней указанную, иначе вкладка по умолчанию.

Это может делать и сервер, считывая куку, но лучше отдать это на откуп клиенту.

Щелчки по вкладкам, это запись куки.

Попробуйте, не получится, помогут. Только не надо для примера выкладывать длиииный html, хватит и трех DIV с одним словом.

warren buffet 13.08.2016 06:17

Цитата:

Сообщение от laimas
бывает "непонятное поведение их" в зависимости от браузера и имени домена.

И какова эта зависимость? Например если домен javascript.ru, а браузер Mozilla Firefox, то какого поведения строки текста следует ожидать?

laimas 13.08.2016 13:52

Цитата:

Сообщение от warren buffet
И какова эта зависимость?

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

warren buffet 13.08.2016 14:15

Сам ничего не знает, а пальцы гнет. Слив защитан.

Нет никакой зависимости, куки уже 100500 лет работают одинаково во всех браузерах. Проблемы возникают только у тех, кто пишет всякую бнопню в path

laimas 13.08.2016 14:59

Цитата:

Сообщение от warren buffet
Нет никакой зависимости, куки уже 100500 лет работают одинаково во всех браузерах.

Ты просто дебил, причем настолько ленивый, что просто ахтунг, хотя не так давеча упрекал в лени другого. А всего то надо Гугл спросить, нахрен ты мне нужен придурок, чтобы я за тебя это делал. Мне надо и я изучил данный вопрос. Ты же зная только "пехепе" пытаешься чего-то пояснять и на РНР, при этом пишеь такой бред, совсем не понимая, что многие здесь прекрасно владеют и серверными языками, включая и РНР, поэтому выглядишь полным идиотом, а совсем не тем, кем ты тут стараешься себя позиционировать.

Ты ноль, и не задавай мне более тупых вопросов, на дураков я время тратить не намерен.

porezon 13.08.2016 17:17

ребят ну помогите пожалуйста же

laimas 13.08.2016 17:24

Цитата:

Сообщение от porezon
ребят ну помогите пожалуйста же

Скачайте плагин для работы с куками для jQuery по указанной ссылке. Ссылку дал на Гит, чтобы ознакомиться как просто устанавливать на нем куки. Хотя бы это сами сделайте, а как будете готовы ставьте вопрос. Ну что такое, это же не так сложно.

warren buffet 13.08.2016 18:38

Цитата:

Сообщение от laimas

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

Еда поперла. ))) Ну, то есть, про странное поведение кукисей в зависимости от браузера от тебя не узнать. Печально. Сакральное знание пропадает.

porezon, блин, там же все написано. Ну давай сюда код той функции show() ж.

warren buffet 13.08.2016 18:52

Кстати, а зачем тут куки, на сервер же все равно ничего не будет передаваться, так что юзай ТС это https://developer.mozilla.org/en-US/...eb_Storage_API

warren buffet 13.08.2016 21:25

Ладно, смотри как можно сделать применительно к твоей каше. Сперва надо засунуть кнопки табов в контейнер с классом menuTabs. Класс нужен как идентификатор.

<span class="menuTabs">
	<div data-for="page1" class="leftname2 active">Новые</div>
	<div data-for="page2" class="leftname2">Обсуждаемые</div>
	<div data-for="page3" class="leftname2">Интересные</div>
</span>


При этом класс активной кнопки - 'active' - должен быть. Он может быть на любой кнопке, но только один и должен быть в html'е.

Второе. Для связи между кнопками и страницами нельзя применять индекс элемента в коллекции. Хотя на практике оно и совпадает, в теории порядок элементов на странице и в DOM'e имеет право не совпадать. Для связи использован тег data-for.

Третье. Класс active должен быть реальным css-правилом, которое показывает активную кнопку, а в каше страниц соответствующая активная страница должна быть видимой, а остальные - нет. Это можно сделать вписав в класс .contextlink0{display:none}, а активной странице через id: #page1{display:block;}

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

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

(function(){

	var 
	pid=function(){return activeTab.getAttribute('data-for');},
	menuTabs=document.querySelector('menuTabs'),
	activeTab=menuTabs.querySelector('active'),
	pageId=pid(),
	
	tog=function(el){
	
		var s = document.getElementById(pageId).style;
		s.display=(s.display=='none')?'block':'none';
		activeTab.classList.toggle('active');
		
		if(el){
			activeTab=el;
			pageId=pid();
			localStorage.lastTabId=pageId;
			tog();
		}
	};
	
	menuTabs.addEventListener('click', 
	
		function(e){
			
			var el=e.target;
			
			if(el.classList.contains('leftname2') && 
				el!==activeTab) tog(el);

		}
	);
	
	var id=localStorage.lastTabId;
	
	if(id && id!=pageId)
		tog(menuTabs.querySelector('[data-for="'+id+'"]'));
	
})();


Скрипт работает живьем, то есть ничего не индексирует и не кеширует.


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