css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
7 Мар
В комментариях к статье «Пользовательские интерфейсы jQuery: свободно перемещаемый контент» меня спрашивали как «запомнить» измененное положение элементов на странице. Наверное наиболее простым решением будет использование COOKIES, тем более, что для библиотеки jQuery написан плагин, который позволяет очень просто ставить, получать и удалять COOKIES’ы.
Для демонстрации я использовал почти тот же самый пример, что и в упомянутой выше статье, дополнив его подключением еще одного файла:
<script src="js/jquery.cookie.js" type="text/javascript"></script>
и добавил три кнопки, с помощью которых можно поставить, удалить или посмотреть cookies.
Попробуйте потестировать пример. При первой загрузке элементы DIV и P займут положение, определенное для них в стилевой таблице. Измените их положение и нажмите кнопку «Ставим COOKIE». Теперь перезагрузите страницу и элементы DIV и P займут уже новое положение, то которое Вы сохранили в cookie. Правда я добавил еще немного анимации в пример, поэтому перемещенные элементы не сразу появляются на новых позициях, а в течение некоторого времени перемещаются туда (это будет хорошо видно, если Вы повторите пример на отдельной странице, а у меня он загружается во фрейме). Если Вы нажмете кнопку «Удаляем COOKIE» и после этого перезагрузите страницу – элементы DIV и P будут занимать положение «по умолчанию». Ну а при нажатии на кнопку «Получаем COOKIE» выскочит окошко с текущими значениями cookie.
Вы можете сохранить исходный код примера и при наличии у Вас библиотеки jQuery, воспроизвести его на своем сайте.
Я не буду полностью приводить CSS и HTML-код, так как он не представляет особенного интереса. Отмечу только, что в примере используются идентификаторы элементов. А вот сам JavaScript-код разберем немного подробнее.
Как обычно, чтобы отследить момент готовности DOM, «обернем» весь наш код в
<script type="text/javascript">
$(document).ready(function(){
// тут пишем код
});
</script>
Далее я привожу кусочек кода, который отвечает за перемещение элементов. Пояснять я его не буду, поскольку подробные объяснения можно найти в статье «Пользовательские интерфейсы jQuery: свободно перемещаемый контент«.
$(".block").draggable({
revert: false,
zIndex:1000,
drag: function(e,ui) {
$(this).css("background-color","#E2F2E2");
},
stop: function(e,ui) {
$(this).css("background-color", "#58AEFC");
}
});
А вот как ставить, удалять и получать cookie – разберем подробно.
Ставим COOKIE
С плагином к jQuery это довольно просто:
$.cookie("the_cookie", "the_value");
но давайте посмотрим на реальный пример (наверное код можно было бы несколько оптимизировать, но я специально «развернул» его для наглядности).
$("#setCookie").click(function () {
var div = $("#draggableDiv").offset();
var pos_div = div.left + ":" + div.top;
var p = $("#draggableP").offset();
var pos_p = p.left + ":" + p.top;
$.cookie("draggableDiv", pos_div);
$.cookie("draggableP", pos_p);
});
Итак, #setCookie – это кнопка при клике на которой совершаются следующие действия:
- с помощью метода offset() в переменную div помещается объект, который содержит свойства top и left для элемента #draggableDiv;
- обращаясь к свойствам top и left, запишем в переменную pos_div строку, содержащую соответствующие значения через какой-либо разделитель;
- проделаем те же самые операции для элемента #draggableP;
- и наконец установим cookies;
Довольно просто, не правда ли? Но мы можем передавать и дополнительные параметры:
$.cookie("the_cookie", "the_value", {
expires: 7,
path: "/",
domain: "jquery.com",
secure: true
});
Удаляем COOKIE
Вообще проще простого:
$.cookie("the_cookie", null);
Т.е. просто записываем cookie со значением null. Но давайте все-таки посмотрим, как это сделано в примере:
$("#delCookie").click(function () {
$.cookie("draggableDiv", null);
$.cookie("draggableP", null);
});
#delCookie – это кнопка, по клику на которой будет записан cookie с именем draggableDiv и значением null. То же самое будет сделано и для cookie с именем draggableP.
Получаем COOKIE
$.cookie("the_cookie");
Разве можно написать что-нибудь более лаконичное? Опять посмотрим, как в реальном примере:
$("#getCookie").click(function () {
var getDiv = $.cookie("draggableDiv");
var getP = $.cookie("draggableP");
alert("Cookie draggableDiv: " + getDiv +
" и Cookie draggableP: " + getP);
});
#getCookie – кнопка, по клику на которой получаем cookies с именами draggableDiv и draggableP, сохраняем их в переменных и выводим в alert().
Вроде бы все понятно, осталось только пояснить, как же все-таки элементы при перезагрузке страницы перемещаются (используется метод animate()) на нужные позиции. Это тоже несложно. В момент готовности DOM, который мы отслеживаем, выполняется следующий код:
if($.cookie("draggableDiv")) {
var div = $.cookie("draggableDiv");
var pos_div = div.split(":");
$("#draggableDiv").animate({
left: pos_div[0],
top: pos_div[1]
}, 500 );
}
Выполняем проверку cookie с именем draggableDiv и если он существует получаем его значение в переменную div. С помощью split() разбиваем строку по разделителю. Далее выполняем анимацию элемента #draggableDiv – задаем координаты его верхнего левого угла (left и top), куда этот элемент будет перемещен в течение 500мс. То же самое делается и для элемента #draggableP.
Буду благодарен, если найдете возможность оставить свои отзывы.
Отзывов (98) на «jQuery – работаем с cookies»
Спасибо за пример, давно хотел разобраться с куками в jq, но всё руки не доходили
Не получатся использовать куки при Sortable() (((
А, все, разобрался )
Спасибо. Реально, сайт самое оно для новичков в jquery )
Спасибо за описание.
Подскажите пожалуйста, а как с помощью drag & drop реализовать механизм, подобный установке виджетов в Wordpress – там виджеты перетаскиваются мышкой на боковую панель и не накладываются друг на друга, то есть соблюдаются размеры блоков… Хочу применить такое «перетаскивание» для добавление блоков на шаблон страницы
Попробуйте прочитать эту статью http://www.linkexchanger.su/2008/21.html
Думаю она Вам поможет…
отлично! как раз разбираюсь с этим…
Спасибо!
Благодарю вас за работу которую вы делаете. Контент просто изящный. Ваш ресурс самый информативный в сегменте jQuery русскоязычных статей. О большем судить не могу, так английский у меня ((((
опять за советом.
при отправке формы нужно ставить cookie. при следующем открытии формы проверять их наличие и производить определенное действие.
например, удалять какой-либо блок.
Здравствуйте!
В данной статье у вас два различных про имени элемента, имена которых Вы знаете.
У меня немного другая ситуация… Имею в странице неизвестное количество элементов типа
и т.д.
Их положение мне нужно будет записать в БД (с этим, думаю, сам справлюсь).
Как проще и лучше огранизовать их обработку?
Найти в странице все img-элементы у которых есть аттрибут name и пробежаться циклом добавляя к point значение name?
Спасибо.
Здравствуйте!
У Вас в данном примере два элемента, имена которых Вам заранее известны.
У меня другая ситуация, когда на странице неизвествное количество элементов типа
.
Как проще и правильнее будет организовать их обработку? Выбрать все эелементы img с атрибутом name и пробежаться по ним циклом, добавляя к point значение name?
Или существует какой-то способ сказать что-то типа $(«.point»+число)?
Спасибо.
Простите,
img class=»point1″ name=»1″ src=»/site_media/images/point.png»
img class=»point2″ name=»2″ src=»/site_media/images/point.png»
А зачем имя класса с цифиркой – это же класс, а не id? Ведь есть еще атрибут name.
Наверное это можно сделать примерно так:
var data = new Object();
$(«img.point»).each(function() {
var tmp = new Array();
var name = $(this).attr(«name»);
// здесь же же получаем другую нужную информацию
// об этом элементе – его положение т.д.
// строим массив tmp из нужных значений
// добавляем готовый tmp в объект data
});
В итоге получаем данные – объект массивов, готовые к передаче на сервер.
Вам будет полезно прочитать статьи про JSON, думаю пригодится.
Добрый день.
Беда с куками в IE
Если домен указан www то куки в ИЕ почему то не перезаписываются, хотя если домен без www то все работает.
Подскажите как побороть?
блин у меня нполучаеться..(( пожалуйсто вставте куку сюда плз..
$(document).ready(function(){
$(«#personal»).click(function(){
$(«#personal»).toggleClass(«bShut»);
$(«#personalcontect»).slideToggle(«0.90, 0.50″);
});
});
Так поставить-то несложно.
$.cookie(«the_cookie», «the_value»);
А что запоминать-то надо?
этот скрипт тугл, «Скрыть/показать текст» хочу чтобы он сохранял то что пользователь укажет если скроет то пусть сохраниться скрытым если покажет ту пусть сохраниться показаным т.е Куки. Я сейчас плохоо соображаю. Код пробывал ставить вроде незаработал, плагин поставил..
плз стукни в icq 744961 …
Здравствуйте. Очень заинтересовался технологией jquery. Сейчас только начал разбираться…..у меня есть несложный вопрос…..
я хочу сделать на сайте активную ссылку через jquery.
Пишу вот такой код:
$(document).ready(function(){
$(«.links div»).click(function(){
$(«.links div»).removeClass(«active»);
$(this).addClass(«active»);
});
})
Присоединяю таблицу стилей, все работает. Подскажите, пожалуйста, как мне реализовать сохранение сессии активной ссылки…
Да умну такой же вопрос =) АВТООРРРРРРРР ТЫ ГДЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕе
Гена Букин вы гдееееее……
To Николай:
Если Ваша идея в том, чтобы сделать именно через сохранение в cookies’ах, то по-любому надо, чтобы ссылку было можно как-то идентифицировать. Тогда этот идентификатор можно будет записать например:
$.cookie("aLink", "someId");А при очередной загрузке страницы считываем эту куку:
var tmp = $.cookie("aLink");получая таким образом id той ссылки, которой необходимо добавить класс active.
а мне??? мне вы поможете?? :*(
To nemo:
Я – не Букин. А на вопрос где, отвечу – вообще-то работаю. А вот блог – это уже для души и поэтому по вечерам и выходным. Помогу, если пойму проблему. Дайте мне минут 10, сначала покурить, а потом еще раз Ваш вопрос посмотреть.
вот полный код:
$(document).ready(function(){
$(«#personal»).click(function(){
$(«#personal»).toggleClass(«bShut»);
$(«#personalcontect»).slideToggle(«0.90, 0.50″);
$.cookie(«#personal», «the_value»);
});
});
Информация
<a href=»profileEdit.php»>редактировать</a>
текст
обычный тугл.. который сворачивает и обратно выворачивает текст.. я хочу чтобы куки запоминали когда текст сворачивают или выворачивают..
ой пипец!! вест код та утанул в пост.. Пазор… ВЫ ЧТО ОТКРыЛИ ДОСТУП К ШТМЛ ДЛЯ ГОСТЕЙ И ВООБЩЕ?? ТАКИМ ТЕМПОМО МОНА ВЗЛОМАТЬ БЛОГ!!!
nemo, Вы хотите чтобы я Вам помог или будете попробовать «взломать» блог? Мне Ваш код не нужен, я в принципе в комментариях (за редким исключением) принципиально не даю готовых решений, а стараюсь разъяснить как можно сделать.
я непытался взломать, я пытался скинуть полный код… очень верю в вашу помощ..
я буду ждать ответа …вечно!! я в вас верю..
Тогда слушайте (читайте). Если говорить о Вашем коде (отступаю от принципов), то сначала я засомневался в синтаксисе slideToggle(‘0.90, 0.50′)
Вообще-то верно вот так: slideToggle(speed,[callback]) а у Вас в параметрах что передается?
Насколько понял из Вашего кода – открывается закрывается один-единственный блок (сужу по тому, что у него есть id – personalcontect), значит Вам надо фиксировать в куке его состояние – открыт он или закрыт.
$.cookie('personal', 'open'); // открыт $.cookie('personal', 'closed'); // закрытКак именно Вы будете узнавать это состояние – думайте, тут Вам лучше знать. Например на основании существования класса bShut, который Вы используете в toggleClass. И ставить куки тогда лучше в callback-функции в slideToggle.
Ну, а при новой загрузке надо будет считывать эту куку:
var tmp = $.cookie('personal'); // open или closedи на основании ее значения решать открыть или не открывать соответствующий элемент.
Проще объяснить не могу – честно.
я полностью вас понял, просто раньше вашу версию я негде невидел.. а в офф сайте open closed эти значения можно осматреть ?? я кроме самого плагина ненаходил нечего..
все теперь понел. Спасибо Генадий…БУКИН
гена букин.. гена букин…лай ла ла ла ла ла…..
nemo, не курите больше такой травы….
Да, и не надо замусоривать комменты, ок?
блин у меня неполучаеться(………
полностью понел что вы скзали. но чтото у меня невыходит(
я так понял
$(document).ready(function(){
$(”#personal”).click(function(){
$(”#personal”).toggleClass(”bShut”);
$(”#personalcontect”).slideToggle(”0.90, 0.50″);
$.cookie(”здесь должно быть название куки одинаковое”, “здесь должно быть значение при срабатывание которого кук и сохроняет положение”);
var tmp = $.cookie(‘personal’); // а эта считывает каку
});
});
так?
ой я неправильно напсал, пропустил строку да ладно..
to nemo
вы принципиально к программированию отношение имеете?
для начала нужно проверить не записана ли кука уже
var tmp = $.cookie(’personal’);
если значение tmp не пустое значит куку раньше уже сохранили и теперь нужно ее проверить на значение (open/close) и отработать при open, тогда вызываем SlideToggle
по поводу slideToggle(”0.90, 0.50″); – читай выше, уже ответили «Вообще-то верно вот так: slideToggle(speed,[callback])»
callback – если по простому, вызывается при завершении действия slideToggle.
p.s. не спамь пожалуйста, тут не форум, а блог, а блог читают и делают выводы.
по поводу slideToggle – я давно понел просто нечайно старый пример скопировал и неаметил
по повуду cookie я тоже давно понел..
to Maksim спасибо, но вы бы лучше готовый мне скрипт сделали..
темболее у меня неработает это slideToggle(speed,[callback])”
speed,[callback]
как мне сделать двух сторонюю скорость? Когда я ставлю подоюные скопки.. то и ззаних неработает или просто толку нет.
делай примеры а некопируйте офф сайта.
to nemo
удочку тебе дали, иди рыбачь
я уже третий день схожу с ума) не могу сделать кукиес на Sortable
в выше описаном примере есть «draggableDiv» и «draggableP» а в Sortable будит SortableDIV и SortableP?
Вопшим вопрос: что вставлять вместо «draggableDiv» и «draggableP» кода делаеш кукиес на Sortable ?
спосибо за помощ заранее
Не надо сходить с ума – надо просто понять. Куки имеют (как минимум) имя и значение. draggableDiv и т.д. – это просто выдуманное имя, которому присваивается какое-то значение (когда кука ставится) и по этому имени можно получить его значение, когда кука считывается. Уже на основании этого значения (и имени конечно) предпринимаются какие-либо действия.
спосибо за помощ конечно, но у меня всиравно ничё не выходин… либо с кнопками проблема, потомучто они вопше не реагируюут, либо с скриптом, но я уже незнаю шо там можно менять и писать
Здравствуйте, Геннадий.
Делаю некое подобие WYSIWYG-редактора (сравнение очень пространное).
Хотелось бы, с помощью этого плагина засовывать в куки полный текст одного блока, правда, пока не совсем пойму как это делать.
Если Вам не сложно и есть свободное время – будьте любезны, уделите его мне.
К сожалению, в JS и в частности в JQuery я почти полный профан.
Жду с нетерпением, заранее спасибо!
я разобрался как
но непонял как прописать класс1 присворачивании класс2 припоказе bOprn и bShut плз вставте сюда их..
$(document).ready(function() {
$(”#wrappercontect”).hide();
$(”#wrapper”).click(function(){
if ($(”#wrappercontect”).is(”:hidden”)) {
$(”#wrappercontect”).slideDown(”slow”);
$.cookie(’showTop’, ‘collapsed’);
return false;
} else {
$(”#wrappercontect”).slideUp(”slow”);
$.cookie(’showTop’, ‘expanded’);
return false;
}
});
var showTop = $.cookie(’showTop’);
if (showTop == ‘collapsed’) {
$(”#wrappercontect”).show();
};
});
и снимите кляп с n e m o !!
…но непонял как прописать класс1 присворачивании класс2 припоказе bOprn и bShut плз вставте сюда их..
Что касается меня, то я уж точно ничего не понял – это из какого места?
P.S. Константин, fsdfdd и nemo – одно и тоже лицо или разные?
Геннадий, насчет них не могу утверждать, но я точно абсолютно реальная личность, нуждаюсщаяся в помощи спеца. Рассматриваю вариант небезвозмездной консультации
нет я не кнстатин я n e m o которого вы забаниле
я просил дописать toggle class чтобы работали с куками также хорошо. но для этого как я понимаю нужно будет работать с remove и add class
Уфф…, ладно вроде понял.
Константин, если Вам нужны детали – киньте код (часть кода) через форму здесь.
nemo не разбаню – Вы вопросы задаете так, как будто сами себя обогнать хотите… Я даже понять никак не могу о чем Вы спрашиваете? Попробуйте собраться и успокоиться, а потом сядьте и напишите свой вопрос спокойно, прочитайте его и подумайте – сможет ли человек, который не знаком с Вашими мыслями, понять о чем Вы спрашиваете. Когда сможете сделать так – пожалуйста сюда же.
Пожалуйсто помогите зделать кликабельный класс на тугл. Т.е Я делай тыц и класс меняеться ToggleClass.Впринцепи я знаю как сделать тугл класс с помощью toggleclass(«класс») – но этот способ негодиться для моего скрипта с куками нужно установить иной способ через addclass(«класс») и через removeclass(«класс») ну вам понятней как.
вот сам код:
$(document).ready(function() {
$(”#wrappercontect”).hide();
$(”#wrapper”).click(function(){
if ($(”#wrappercontect”).is(”:hidden”)) {
$(”#wrappercontect”).slideDown(”slow”);
$.cookie(’showTop’, ‘collapsed’);
return false;
} else {
$(”#wrappercontect”).slideUp(”slow”);
$.cookie(’showTop’, ‘expanded’);
return false;
}
});
var showTop = $.cookie(’showTop’);
if (showTop == ‘collapsed’) {
$(”#wrappercontect”).show();
};
});
огромное спасибо . помощ получил по почте
это то что мне нужно было!!
Отличный сайт, спасибо за информацию!
Вот ещё вариант решения сохранения порядка сортировки (при помощи метода «serialize»), возможно кому-то он покажется более подходящим
http://noteskeeper.ru/article/save-state-jquery-ui-sortable
а у меня в ие не работает ((((
$(document).ready(function(){
var cook = $.cookie(«but»);
if (cook==0) { $(«#panel»).slideUp();
$(«.btn-slide»).removeClass(«active»);}
else{$(«#panel»).slideDown();
$(«.btn-slide»).addClass(«active»);}
alert(cook);
$(«.btn-slide»).click(function(){
$(«#panel»).slideToggle(«slow»);
$(this).toggleClass(«active»);
if ( $(this).hasClass(«active») )
{ $.cookie(«but», «1″)}
else { $.cookie(«but», «0″) };
var cook = $.cookie(«but»);
alert(cook);
// return false;
});
в мозиле все чудесно,а в ие куки не запоминает…Что делать?
Попробуйте сбрасывать куку не присваивая ей нулевое значение, а делая
$.cookie('but', null);а считав куку в переменную cook, проверять условие:
if(cook) { ... }не присваивается кука в ие.Тоесь она по умолчанию остается null((Может хак какой-то есть?…И в опере работает,а в ие не хочет..Я в отчаянии…..Может еще идеи??
Вот пример кода – все работает и в FF, и в IE, и в т.д….
$(document).ready(function(){$.cookie('but')==1 ? alert('cookie = 1') : alert('cookie = 0');
$('button').click(function(){
$(this).text()=='Set' ? $.cookie('but', '1') : $.cookie('but', '0');
return false;
});
});
А в body просто две кнопочки:
<button>Set</button><button>Unset</button>
Вообще-то при загрузке лучше проверять на наличие cookie, а не на его отсутствие – это логичнее и убережет от недоразумений.
Здравствуйте Генидий, блог .. радость для души… спасибо, но при работе с Cookis возникает пара вопросов, почему они не работают с IE, ну а если есть решение то какое?!
Второй вопрос – как правильно организовать запоминание открытых и закрытых вкладок!?
Попробывал код
/*сильно не пинать*/
$(‘.iTug’).click(function(){
var tog = $(this).next();
var index = $(‘.iTug’).index(this)+1;
var cook = $.cookie(«boxclose»);
if($(this).hasClass(«hil»))
{
tog.hide(500);
cook = cook.replace(‘l’+index+’.',»);
if(cook) $.cookie(«boxclose», cook+’l'+index+’.');
$(this).removeClass(«hil»)
}
else
{
tog.show(500);
if(cook) cook = cook.replace(‘l’+index+’.',»);
if(cook) $.cookie(«boxclose», cook);
$(this).addClass(«hil»)
}
});
var pos_div = $.cookie(«boxclose»).split(«.»);
for(i in pos_div)
{
var pdiv = $(‘#’+pos_div[i]).find(‘.mainBl’);
pdiv.hide();
}
/*конец кода*/
Думаю тут Вам … обьяснять ни чего не надо, интуитивно понять код можно, работает во всех браузерах кроме IE… ммм… И еще вопрос… Как знаея класс обьекта получить его Id? Очень бы пригодилось!
Спасибо за внимание, с нитерпением жду ответа, Можно и на почту если не затруднит!
Сильно извеняюсь за орфографию!
Den, Вы комментарии выше читали? Я по поводу – не работает в IE… Вы попробуйте эту страницу в IE открыть и посмотреть, работает или нет. Я открывал – работает….
Судя по коду Вы меню какое-то делаете? Типа кликнул – открылось, кликнул – закрылось, а при перезагрузке страницы должно открыться в том состоянии, в котором было до перезагрузки, верно?
Я попробую выбрать время (но вероятно только на следующей неделе) и написать небольшую статейку про это. Просто не Вы один с этим затруднения имеете…
Что касается последнего вопроса: если Вы знаете значение атрибутат class – Вы его как-то получали? Почему так же не получить и id? Это такой же атрибут… Ну или если уж именно так хотите, то:
$('.someClass').each(function(){ var someVar = $(this).attr('id'); });Поясню. Поскольку элементов имеющих один и тот же класс может быть несколько надо перебирать их все внутри each, и там уже с ними что-то делать…
Кстати, а почему виджет accordion не использовать?
http://jqueryui.com/demos/accordion/
Можно было бы и акордион!… Но он тоже не запоминает позиции… кстати, я разобрался с cookies… везде работает кроме IE… А именно там не хочет работать нажатие и скрывание самого блока! А раз оно не работает то и cookis не определяет… проблему понять не могу… и еще тут баг – для скрытия (показа), нужно ликнуть 2 раза, а затем уже можно и по одному, устранить так же ни как не могу!
Генадий, с переключенией разобрался… все работает… вот код … одинаково реагирует с IE и другими браузерами.
_______________________________________
if(!$.cookie(«boxclose»)) $.cookie(«boxclose», »);
else
{
var posDiv = new Array();
var posDiv = $.cookie(«boxclose»).split(«.»);
for(i in posDiv)
{
var pdiv = $(‘#’+posDiv[i]).find(‘.mainBl’);
pdiv.hide();
}
var ck = $.cookie(«boxclose»)
var ck = ck.replace(‘none’,»);
$.cookie(«boxclose», ck);
}
for(i in user_prog) $(‘.profileHead’).append(»+user_prog[i]+»);
$(‘.iTug’).click(function(){
var tog = $(this).next();
var index = $(this).attr(‘id’).replace(‘b’,'l’);;
var lindex = index+’.';
var cook2 = $.cookie(«boxclose»).replace(lindex,»);
if($(this).hasClass(«hil»))
{
tog.hide(500);
$.cookie(‘boxclose’, cook2+lindex);
$(this).removeClass(«hil»)
}
else
{
tog.show(500);
$.cookie(«boxclose», cook2);
$(this).addClass(«hil»)
}
});
____________________________________
html код
___________________________________
Переключатель
____________________________________
Можно будет использовать для написания статьи по переключателям, спасибо, удачи=)
P.S Советую добавить BB код (
) в коментариях)) Удобнее будет разбирать то что написано!html…. он вырезал…. Ну вообщем у кнопки id=»b1″ или id=»b2″
Она должна находиться в блоке у которого id=»l1″…
Сообтветсвенно в этом блоке(можно и сам блок(сматрите сами(это мой выбор))) переключаеться… и запоминает в кук)
И вообще добавте мен в ICQ 4ноль5935…. где то поможем друг другу)!
Здравствуйте, Геннадий.
у меня вопрос о кодировке cookie:
сам документ в windows-1251
пользуясь вышеорисанным плагином сечу куку с содержимым блока(кирилица+html тэги)
после извлечения ее содержимое читаемо только в Opera и IE, все остальные броузеры выводят содержимое в виде (%3Ch1%3E%1A%26gt%3B%3C/h1%3E)
как можно такое победить?
заранее спасибо.
to Gennady, to Ira
есть какая то заморочка в IE, когда сайт открывается с www и без.
Поборол только одновременным сохранением кукисов для обоих вариантов.
т.е. если человек заходит без www то сохраняю куку и для www. По другому не получалось решить проблему.
IE 6. В 7 та же петрушка. В 8 еще не проверял. Остальные браузеры отрабатывают без вопросов.
To Денис:
Все вполне естественно – передаете в сценарии не ASCII-символы, поэтому они кодируются. Попробуйте при считывании кукисов применить decodeURI.
to Gennady:
проблема решена, спасибо.
Выкладываю рабочий пример который корректно запоминает последнюю открытую вкладку используя куки. Правда для этого необходимо подключить библиотеку jQuery.cookie.
var lastTabIndex = parseInt($.cookie(«lastTab»));
$(«#element»).tabs(lastTabIndex, {fxAutoHeight: true, onShow: function()
{
$.cookie(‘lastTab’, $(‘#element’).activeTab());
}
}
);
Бодрый вечер Генадий, хочу поинтересоваться – возможно ли в печеньку загнать целиком объект со всеми его свойствами и методами ? И если да, то как это грамотно сделать ? Вообще, в куки вроде бы можно только строки записывать (во всяком случае если писать их из РНР). Например есть объект, у которого первый уровень методов – номер записи, а на втором, имя пользователя почта и текст сообщения. (такой вот объект для блога получился). Он сохраняется в печеньку и при перемещении по сайту данные извлекаются не из базы, а из печеньки (понимаю, что идея глупая да и не влезет столько инфы в куку, этот объект просто выдуман для примера). Т.е. для того, что бы отобразить 20 первых коментов надо запустить что то вроде
for( var i=1;i=20;i++){
print(comentObj[i]['user_name']);
print(comentObj[i]['mail']);
print(comentObj[i]['coment']);
}
Вот весь comentObj хочу в куку сохранить.
Вот пример объекта JS (в литеральной нотации):
firstname : 'Ivan', lastname : 'Ivanov', year : '1974', employed : new Date(2004,1,12), phone : { home : '(495)353-5353', mobile : '(903)261-1777' }можно рассматривать и как обыкновенный текст. Так что теоретически можно, а практически – насколько помню, имеются ограничения по размеру. Вот какие именно – точно не помню, но думаю уточнить – не проблема.
На юкозе почемуто не работает. загружаю фаш исходник на сервер юкоза со всема нужными файлами, тогда работает, а когда ставлю код в редактор страниц, обьекты не перемещаются. что делать?
афтар молоток! продолжай в том же духе!
спасибо!
Пытался в stop функции ставить куки, т.е. когда перемещение элемента законилось, ставить куку, но почему-то не работает…
попробуйте все скрипты кроме самой библиотеки перенести в тело сайта. Мне помогло
неа, не помогло, и еще я убрал скрипт
jquery.tablednd.js
так вовсе перестали двигатся элементы , странно
хотя нет просто перестали двигатся потому что в скрипте не закоментил код который использовал этот скрипт
Генадий, спасибо за ваши статьи, все ясно и доходчиво написано, раньше использовал jshttprequest, теперь перехожу на jQuery, благодаря вам разбираюсь
, а ненужные комменты думаю можно и удалить…
Всем привет. Помогите. Я почитал тут посты но так ничего и не понял. Как сделать чтобы положения slideToggle, FadeIn & FadeOut, Show & Hide Запоминались? Я попробовал – не получается. Пожалуйста помогите. Заранее спасибо.
… положения slideToggle, FadeIn & FadeOut, Show & Hide запоминались…
Это не положения – это названия эффектов, применяемых при скрытии и/или отображении элементов. Управлять видимостью/невидимостью элементов можно с помощью css-свойства display. Поэтому при изменении состояния элемента ему обычно добавляют/удаляют имя класса, а уже в cookie можно запомнить, что у такого-то элемента присутствует такой-то класс. Соответственно, при загрузке страницы считывать cookie и на основании их значений добавлять нужным элементом определенный класс.
Gennady, Я попытался но у меня так и не получилось… Вот мой код:
Скрыть\Раскрыть
Сверни миня
Вот и больше ничего не могу сделать. Поясните мне. Дайте пример. Пожалуйста.
Что-то вроде этого:
if($.cookie("open")) { $("div").addClass("open"); } $("h2").toggle( function(){ $(this).next("div").slideDown(1200); $.cookie("open", "open"); }, function(){ $(this).next("div").slideUp(1200); $.cookie("open", ""); } );при такой разметке:
<h2>Заголовок</h2>
<div>Содержимое Содержимое Содержимое</div>
И в стилях, при начальной загрузке div {display:none;} и класс .open { display:block; }
Не забудьте, что кроме самой библиотеки, еще и плагин cookie надо подключить.
И учитывайте, что это только демонстрация принципов!
Скажите пожалуйста в чем может быть причина такой ошибки в IE? В данном случае проверял только для 8-й версии, во всех остальных браузерах в последних версиях все корректно воспроизводится =\
Сообщение: '$.cookie(...)' - есть null или не является объектом Строка: 550 Символ: 1 Код: 0 --- Строка на которой ошибка: clientvariab = $.cookie("crmListClientID").split(',').join("_");Vitaly, а в 6-м или 7-м ie? Не смотрели? Тяжело сказать что-то наверняка – может какая-то особенность именно ie8.
Да, все решил, в ие нужно было проверять существует ли кука, а после уже делать что-нибудь с ее значением, тк здесь значение куки динамически изменяется, при манипуляции чекбоксами, добавляется или удаляется текущий ид, при снятии последнего чекбокса там ничего не остается, вот откуда null, странно что это замечает только ие…
Оказывается в ie и положительные моменты встречаются
Спасибо за статью, очень полезна)))
Здравствуйте.
Не могу найти решение следующей задачи:
У меня есть первая страница к примеру test_1.htm на которой есть ссылка с классом .uroven1 на вторую страницу test_2.htm.
Необходимо чтобы при загрузке страницы test_2.htm в новом окне (использование фреймов исключено) скрипт выполнит любое действие (к примеру выбросит сообщение “WELLCOME”) – только после того как “поймёт или отследит” что открытие этой страницы произошло по событию “клик” на ссылку с классом .uroven1 что на странице test_1.htm.
Да и по большей части важней отследить класс ссылки, по которой перешли на новую страницу.
Сам скрипт вояется в jQuery.
Работа над скриптом ведётся как раз на том сайте на который ссылается мой ник.
Там открытие окна по ссылке должно проводиться дву способами:
1. Вывод через модальное окно -используется избитая тема jquery.fancybox.js (учитывая что в окно подгружается не просто контент а полноценный код html странницы полностью);
2. Вывод через команду “открыть в новом окне”.
Одним из советов Сергея Чикуенока – был использовать куки, на что я сделал черновой вариант следующего:
Код страницы test_1.htm:
Страница Test_1
$(document).ready(function() {
$(«.uroven1″).click(function() {
var metka = 1;
$.cookie(«mparam», metka);
});
$(«.uroven2″).click(function() {
var metka = 2;
$.cookie(«mparam», metka);
});
});
Страница Test_2 класс uroven1
Страница Test_2 класс uroven2
Код страницы test_2.htm:
Страница Test_2
$(window).load(function() {
if ($.cookie(«mparam»))
var getmetka = $.cookie(«mparam»);
if (getmetka == 1) $(«#open_pic1″).click();
$.cookie(«mparam», null);
if (getmetka == 2) $(«#open_pic2″).click();
$.cookie(«mparam», null);
});
$(document).ready(function() {
$(«#open_pic1″).click(function() {
$(«#picture_div1 img»).fadeIn(«slow»);
return false;
});
$(«#open_pic2″).click(function() {
$(«#picture_div2 img»).fadeIn(«slow»);
return false;
});
$(«#close_pic1″).click(function() {
$(«#picture_div1 img»).fadeOut(«slow»);
return false;
});
$(«#close_pic2″).click(function() {
$(«#picture_div2 img»).fadeOut(«slow»);
return false;
});
});
Показать иллюстрацию 1
Скрыть иллюстрацию 1
Показать иллюстрацию 2
Скрыть иллюстрацию 2
Вернуться на страницу Test_1
В итоге Куки работает и даёт мне нужный результат, НО!!!
При открытии ссылки «Открыть в новом окне» и через скрипт модального окна – оказывается что в куки нет моего параметра/переменной.
Надеюсь вы откликнетесь – и хотя бы объясните почему так…
И как можно решить проблему – и кстати коллеги говорят мне стараться не использовать куки – потому что у некоторых поьлзователей куки отключен принудительно, и как можно в коде сделать чтобы для нашей страницы куки включался…?
Заранее спасибо.
С уважением начинающий веб-ламастер и поклонник JQuery.
Вы ооооочень много написали….
Куки у Вас не ставятся потому, что ВЫ ставите их только по событию click. Поэтому при обычном щелчке левой клавишей все и происходит без проблем. При нажатии правой кнопки (чтобы вызвать контекстное меню браузера) надо предпринимать дополнительные действия (отследить щелчок правой клавиши) для того, чтобы писать куки.
Примерно тоже самое и с Fancy – только в том смысле, что читать куки должна страница, которая грузится с помощью Fancy…
Ну а что касается – включить поддержку cookies в браузере пользователя… То что это был бы за браузер, который не слушался бы хозяина, а?
1. Приношу извинения за много /словность кодность.
2. Впервый раз у вас тут закаменотовал и не поставил код страниц под нужным тэгом (немного нагадил в каментах).
3. Как отследить щелчек правой кнопкой?
4. Когда новая страница открывается в новом окне – куки для неё таже что и была в для той страницы из которой переходили по ссылке?
Как отследить правую кнопку – просто погуглите немного, найдете массу примеров кода. А cookie – какой поставите, такой и будет.
Вы меня извините… Но я вот сейчас сижу и просто истеричсеки смеюсь… У меня истерика.
Я понимаю что таких как я миллионы.
Вы меня извините – но если я попросил помощи, наверно это не потому что мне лень погуглить или посидеть сутки двое троя пред монитором.
Я у многих просил помощи но все как и Вы в данный момент как всегда ткнули пальцем в неба.
Вот после недели моих просьб и кликов о помощи – мне толком не помог НИКТО.
Отбили желание раз и навсегда у кого то что то каментить спрашивать совета, или делиться своим опытом. Просто как человека прошу помочь мне разобраться с моей проьблемой. Я уже неделю не могу разобраться.
У меня есть проблема которую я озвучил тем самым огромных комментарием.
На Ваш взгляд как её можно решить оптимаьлней? Глобальные переменные? Куки? document.referrer? location.hash?
Прошу совета как специалиста… мастера…
И самое главное – Огромная просьба в кратце маленький пример кода – чтобы я знал в каком направлении идти.
К примеру – может я мало сплю, и стал дико не внимателен – но то как объявлять блобальные переменные и поьлзоваться ими так и не разобрался.
Я уже в отчаянии так как сроки провалил. Потому что встал на своей проблеме очень твёрдо. ОТ модальных окон отказаться нельзя, вроде фенси получилось быстро и опотимально, и выполнение небольшого скрипта при открытии страницы в модальном окне – часть принципа навигации олт которого не откажешься.
Помогите. Уделите мне и моему сайту хотя 5 минут вашего драгоценного времени.
Походу это действительно истерика
…. Не стоит так отчаиваться. Просто если Вы беретесь за разработку, да еще и оговорены сроки – то наверное надо быть уверенным в том, что сможете решить все технические задачи.
Спокойнее… И сначала про cookie.
$(function(){ $('a').mousedown(function(){ $.cookie('mparam', 1); }); });Вот таким образом (используя не click, а mousedown) Вы сможете поставить cookie не только по нажатию левой клавиши мыши, но и по правой клавише тоже. Если cookie будет поставлена, значит ее можно будет считать даже в том случае, если будет открыто новое окно через контекстное меню браузера.
Дальше… Как Вы открываете fancy? Собственно не столь важно. Важно другое – перед тем, как в окно fancy будет загружен какой-то html (который будет читать cookie) эти cookie должны быть записаны…
Имхо, у Вас весь затык вышел только в том, что не ставились cookie и все…
Ну и по теории… Об использовании cookies. Способ действительно не даст 100% гарантии. Если работаете на PHP, то можно воспользоваться сессиями и хранить данные там – от браузера клиента тут уже зависеть ничего не будет. Еще можно использовать БД и писать/читать данные оттуда, но имхо это затратнее…
Большое спасибо что откликнулись. Истерика не из-за сроков, а из-за того что я неожидал что почти везде толком мне ничего конкретного не подскажут.
Скажу как есть.
Я сам упёртый человек, и стараюсь самостоятельно решать любые проблемы. У меня было много трудностей, которые я решал неделями. Максимум гуглил, высматривал: что статьи, что каменты остальных, а также решения их проблем и советы им же.
Можно сказать что наткнулся почти на все подводные камни что мог, но на последней проблеме я сдался. Решил всё же переступить через себя и попросить помощи советов, но когда напоролся на ответы вроде «на отвали» – мягко говоря был огорчён.
Я прекрассно понимаю, что многие авторы подобных порталов справчного характера – подразумевают что взывающие к помощи -не будут лениться и постараются сначала сами решить проблему а автор максимум быстро на глаз укажет ошибку что упустил горе-разработкич. Понимаю что у Вас нет времени каждому помогать, и тем более если это подразумевает трату каких либо но усилий – да и за этот труд – в принципе должен оплачиваться.
Всё понимаю. Но когда в который раз мне «показали пальцем в небо» – вот тут то я и сорвался.
Я просто ожидал ну наверно такого: «Ой. парнишка. Ща дай Бог памяти… вспомню. Знаешь была у меня такая проблема года два назад. Там было так и так. И вот примерный код как было у меня. Ты вот посмотри разберись, и сам уже адаптируй это под решение своей проблемы. Думаю тебе поможет. Удачи тебе.»
Но получал холодное: «Ну наверно попробуй глобальные переменные», а на другом форме по явя-скриптам мне местный гуру вообще ответил двумя словами: «document.referrer» – и как оказалось он так и тем же отвечал не впервый раз. Уж лучше бы послал на все три слова разом я бы не парился – перелопачивая форум по каждой теме, где как оказалось на многие просьбы тупо забивают.
Мне казалось что подобные сайты делаются для одного блага: «Ребята делимся опытом – Давай те совместно поднимать уровень РУНЕТА выше и выше и выведём его вперед!»
Но… Оказалось что то совсем другое… До сих пор так и не понял. С какой целью были созданы и функционируют форумы на темы сайтостроения…
Кстати mousedown – не помогло почему то…
Да, и не могли бы подсказать как в моём случае можно решить проблемму с помощью глобальных переменных?
Я пробовал, на таком же принципе как и с куки, но тоже ни привета ни ответа.
Глобальная переменная которую объявил на Test_1 распространяет своё функционирование на странице Test_2 ?
Или в принципе – это невозможно?
Pastorman, Вы не обижайтесь, но если Вы беретесь что-то ваять, используя JS, то сначала надо хотя бы немного изучить основы. Иначе Вас действительно везде будут посылать…. Просто потому, что ответ на вопрос тут же порождает еще два Ваших вопроса…
Кстати mousedown – не помогло почему то…
Вставьте вместо $.cookie(‘mparam’, 1); обычный alert, и проверьте – работает без проблем!!!
P.S. Инструмент, который очень сильно поможет в отладке сценариев JS – Firebug.
Обсуждение статьи можно продолжить на форуме jQuery.