var p = cookie.indexOf(”="); // Отыскать первый знак =
var name = cookie, substrings, p); // Получить имя cookie
var value = cookie.substring(p+1); // Получить значение cookie
value = decodeURIComponent(value); // Декодировать значение
cookies[name] = value; // Сохранить имя и значение в объекте
}
return cookies;
}
20.2.4.
Ограничения cookies
Cookies предназначены для сохранения небольших объемов данных серверными сценариями, которые должны передаваться на сервер при обращении к каждому соответствующему URL-адресу. Стандарт, определяющий cookies, рекомендует производителям броузеров не ограничивать количество и размеры сохраняемых cookies, но броузеры не обязаны сохранять в сумме более 300 cookies, 20 cookies на один веб-сервер или по 4 Кбайт данных на один cookie (в этом ограничении учитываются и значение cookie, и его имя). На практике броузеры позволяют сохранять гораздо больше 300 cookies, но ограничение на размер 4 Кбайт для одного cookie в некоторых броузерах по-прежнему соблюдается.
20.2.5. Реализация хранилища на основе cookies
Пример 20.2 демонстрирует, как поверх cookies можно реализовать методы, имитирующие прикладной интерфейс объекта
Storage
. Передайте конструктору
СоokieStorage
желаемые значения атрибутов
max-age
и
path
и используйте получившийся объект подобно тому, как вы использовали бы
localStorage
или
sessionStorage
. Однако имейте в виду, что этот пример не реализует событие «storage» и не выполняет автоматическое сохранение или извлечение значений при записи или чтении свойств объекта
CookieStorage
.
Пример 20.2. Реализация интерфейса объекта
Storage
на основе
cookies
/*
* CookieStorage.js
* Этот класс реализует прикладной интерфейс объекта Storage, на который ссылаются
* свойства localStorage и sessionStorage, но поверх HTTP Cookies.
*/
function CookieStorage(maxage, path) { // Аргументы определяют срок хранения
// и область видимости
// Получить объект, хранящий все cookies
var cookies = (function { // Функция getCookies, реализованная выше
var cookies = {}; // Возвращаемый объект
var all = document.cookie; // Получить все cookies в одной строке
if (all === "") // Если получена пустая строка
return cookies; // вернуть
пустой объект
var list = all.split(";”); // Разбить на пары имя/значение
for(var і = 0; і < list.length; i++) { // Для каждого cookie
var cookie = list[і]:
var p = cookie.indexOf("="); // Отыскать первый знак =
var name = cookie, substrings, p); // Получить имя cookie
var value = cookie.substring(p+1); // Получить значение cookie
value = decodeURIComponent(value); // Декодировать значение
cookies[name] = value; // Сохранить имя и значение
}
return cookies;
});
// Собрать имена cookies в массиве
var keys = [];
for(var key in cookies) keys.push(key);
// Определить общедоступные свойства и методы Storage API
// Количество хранящихся cookies
this.length = keys.length; *
// Возвращает имя n-го cookie или null, если n вышло за диапазон индексов
this.key = function(n) {
if (n < О И n >= keys.length) return null;
return keys[n];
};
// Возвращает значение указанного cookie или null,