Когда свойство cookie используется в JavaScript_выражении, возвращаемое им значение содержит все cookie_файлы, относящиеся к текущему документу. Эта строка представляет собой список пар имя–значение, разделенных точками с запя_ той, где имя – это имя cookie_файла, а значение – его строковое значение. Это зна_ чение не включает каких_либо атрибутов, которые могли быть установлены для cookie. Для получения значения cookie с определенным именем могут использо_ ваться методы String.indexOf() и String.substring(), а для разбиения строки cook_ ie_файла на отдельные составляющие – метод String.split().
После извлечения значений cookie_файла из свойства cookie их требуется интер_ претировать, основываясь на том формате или кодировке, которые были указа_ ны создателем cookie. Например, в одном cookie может храниться несколько единиц информации в полях, разделенных двоеточиями. В этом случае придется для извлечения различных фрагментов информации обратиться к соответствую_ щим строковым методам. Не забудьте вызвать функцию decodeURIComponent() для значения cookie, если оно было закодировано функцией encodeURIComponent().
Следующий фрагмент демонстрирует, как выполняется чтение свойства cookie, как из него извлекается отдельное значение и как потом можно использовать это значение:
// Прочитать свойство cookie. В результате будут получены все cookies данного документа.
19.4. Пример работы с cookie
var allcookies = document.cookie;
// Отыскать начало cookie_файла с именем "version" var pos = allcookies.indexOf("version=");
// Если cookie с данным именем найден, извлечь и использовать его значение if (pos != _1) {
var start
= pos + 8;
//
Начало значения cookie
var end
=
allcookies.indexOf(";", start);
//
Конец значения cookie
if (end
== _1) end = allcookies.length;
var value
= allcookies.substring(start, end); //
Извлекаем значение
value =
decodeURIComponent (value);
//
Декодируем его
// Теперь, получив значение cookie_файла, мы можем его использовать.
// В данном случае значение было установлено равным дате изменения
// документа, поэтому мы можем использовать это значение, чтобы узнать,
// был ли документ изменен с момента последнего посещения пользователем. if (value != document.lastModified)
alert("Документ был изменен с момента вашего последнего посещения");
}
Обратите внимание: строка, полученная при чтении значения свойства cookie, не содержит какой_либо информации о различных атрибутах cookie_файла. Свойство cookie позволяет установить эти атрибуты, но не дает возможности про_ читать их.
Пример работы с cookie
Дискуссия о cookies завершается примером 19.2, где определяется вспомога_ тельный класс, предназначенный для работы с cookies. Конструктор Cookie() чи_ тает значение cookie с заданным именем. Метод store() записывает данные в этот cookie, при этом устанавливаются значения атрибутов, определяющих срок жизни, путь и домен, а метод remove() удаляет cookie, записывая значение 0 в ат_ рибут max_age.
Класс Cookie, определяемый в этом примере, сохраняет имена и значения не_ скольких переменных состояния в единственном cookie. Чтобы записать данные в cookie, достаточно просто установить значения свойств объекта Cookie. Когда вызывается метод store(), имена и значения свойств, добавленные к объекту, становятся значением сохраняемого cookie_файла. Аналогично при создании но_ вого объекта Cookie конструктор Cookie() ищет существующий cookie с заданным именем, и если находит, его значение интерпретируется как набор пар имя–зна_ чение, после чего создаются соответствующие свойства нового объекта Cookie.
Чтобы помочь разобраться с примером 19.2, сначала рассмотрим пример 19.1, ко_ торый представляет собой простую веб_страницу, использующую класс Cookie.
Пример 19.1. Порядок использования класса Cookie
<script src="Cookie.js"></script><!__ подключить класс Cookie __> <script>
// Создать cookie, который будет использоваться для сохранения
// информации о состоянии данной веб_страницы.
var cookie = new Cookie("vistordata");
478Глава 19. Cookies и механизм сохранения данных на стороне клиента
// Сначала попытаться прочитать данные, хранящиеся в cookie.
// Если он еще не существует (или не содержит требуемые данные),
// запросить данные у пользователя
if (!cookie.name || !cookie.color) {
cookie.name = prompt("Введите ваше имя:", ""); cookie.color = prompt("Какой цвет вы предпочитаете:", "");
}
// Запомнить число посещений страницы пользователем if (!cookie.visits) cookie.visits = 1;
else cookie.visits++;
// Сохранить данные в cookie, куда включается счетчик числа посещений.
// Определить срок жизни cookie в 10 дней. Поскольку атрибут path
// не определяется, cookie будет доступен всем веб_страницам того же
// каталога и вложенных каталогов. Поэтому необходимо гарантировать,
// что имя cookie "visitordata" будет уникальным для всех этих страниц. cookie.store(10);
// Теперь можно воспользоваться данными, полученными из cookie
// (или от пользователя), чтобы приветствовать пользователя по имени,
// Затем сохранить cookie со сроком жизни, равным 0
this.store(0, path, domain, secure);
}
/**
* Этот статический метод пытается определить, разрешено ли использование cookies
* в броузере. Возвращает значение true, если разрешено, и false _ в противном случае.
19.5. Альтернативы cookies
* Возвращаемое значение true не гарантирует, что сохранение cookies
* фактически разрешено. Временные cookies сеанса по_прежнему могут быть
* доступны, даже если этот метод возвращает значение false.
*/
Cookie.enabled = function() {
// Воспользоваться свойством navigator.cookieEnabled, если оно определено в броузере if (navigator.cookieEnabled != undefined) return navigator.cookieEnabled;
// Если значение уже было помещено в кэш, использовать это значение if (Cookie.enabled.cache != undefined) return Cookie.enabled.cache;
// Иначе создать тестовый cookie с некоторым временем жизни document.cookie = "testcookie=test; max_age=10000"; // Установить cookie
// Теперь проверить _ был ли сохранен cookie_файл
var cookies = document.cookie;
if (cookies.indexOf("testcookie=test") == _1) { // Cookie не был сохранен
return Cookie.enabled.cache = false;
}
else {
// Cookie был сохранен, поэтому его нужно удалить перед выходом document.cookie = "testcookie=test; max_age=0"; // Удалить cookie return Cookie.enabled.cache = true;