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>
. Однако имейте в виду, что этот пример не реализует событие «storage» и не выполняет автоматическое сохранение или извлечение значений при записи или чтении свойств объекта
<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 === &quot;&quot;)   // Если получена пустая строка</b>

<b>    return cookies; // вернуть пустой объект</b>

<b>  var list = all.split(&quot;;”); // Разбить на пары имя/значение</b>

<b>  for(var і = 0; і &lt; list.length; i++) { // Для каждого cookie</b>

<b>    var cookie = list[і]:</b>

<b>    var p = cookie.indexOf(&quot;=&quot;);       // Отыскать первый знак =</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 &lt; О И n &gt;= 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 + &quot;=&quot; + encodeURIComponent(value);</b>