Для работы с куки из сценария JavaScript используется свойство document.cookie. Следующая команда покажет все установленные куки:
alert(document.cookie);
Она выдаст нечто вроде: name1=value1; name2=value2; ..., т.е. перечисление паримя=значение, разделенных точкой с запятой и пробелом. Как видите, нам показывают только имена и значения куки; другие атрибуты куки (срок действия, домен и т.д.) через свойствоdocument.cookie недоступны.
Но обычно требуется больше - узнать, установлено ли значение конкретной куки, и если установлено, то прочитать его. Значит, нужно разобрать полученную выше строку с помощью методов работы со строковыми объектами. Для этого создадим две функции: existsCookie - проверяет, имеется ли куки с данным именем; CookieValue - возвращает значение куки по ее имени:
function existsCookie(CookieName){ // Узнает, имеется ли куки с данным именем return (document.cookie.split(CookieName+'=').length>1);} function CookieValue(CookieName){ // Выдает значение куки с данным именем var razrez = document.cookie.split(CookieName+'='); if(razrez.length>1) { // Значит, куки с этим именем существует var hvost = razrez[1], tzpt = hvost.indexOf(';'), EndOfValue = (tzpt>-1)? tzpt : hvost.length; return unescape(hvost.substring(0,EndOfValue));}}
Мы воспользовались тем, что пары имя/значение разделены точкой с запятой, а значение куки не может содержать символ "точка с запятой" (" ; "). На самом деле, если произвести попытку установить куки со значением, содержащим этот символ, то в результате значение будет обрезано до первого вхождения этого символа. Попутно заметим, что в целях совместимости не рекомендуется использовать в значении куки символы: точка с запятой, пробел, равенство - если они все же требуются, их следует заменить на %3B, %20 и %3D, соответственно. Проще всего при создании куки пользоваться функцией escape(), которая и произведет все эти преобразования, а при чтении куки - обратной функцией unescape(), что мы и сделали выше.
Далее мы хотим создавать или менять cookie. Разработчики языка JavaScript позаботились о web-программистах и реализовали свойство document.cookie довольно интеллектуально. Если выполнить простую команду присвоения:
то прежние хранившиеся куки не будут стерты, как можно заподозрить. Вместо этого браузер проверит, не имеется ли уже в document.cookie куки с именем ИмяКуки. Если нет, то новая куки будет добавлена в document.cookie ; если да, то для куки с этим именем будутобновлены указанные в команде параметры (значение, срок действия и т.д.). Это поведение куки демонстрирует следующий пример:
Напишем универсальную функцию для задания куки, которой Вы можете пользоваться на практике. Первые два ее аргумента ( name и value ) обязательны, остальные необязательны. В ней используется функция escape(), которая преобразует специальные символы в их коды, например, пробел в %20, равенство в %3D и т.д.
Остается научиться передавать этой функции время истечения срока действия куки в правильном формате (пример см. выше). В этом нам поможет метод toGMTString() объектаDate. На практике заранее известно не время истечения срока действия куки, а сам срок действия (в днях, часах, минутах и т.д.), отсчитывая от текущего момента. Напишем функцию, которая по этим данным возвращает точный момент времени, причем в нужном нам формате:
function TimeAfter(d,h,m){ // Выдает время через d дней h часов m минут var now = new Date(), // объект класса Data nowMS = now.getTime(), // в миллисекундах (мс) newMS = ((d*24 + h)*60 + m)*60*1000 + nowMS; now.setTime(newMS); // новое время в мс return now.toGMTString(); }