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