JavaScript. Подробное руководство, 6-е издание, стр. 336

20.2.2. Сохранение cookies

Чтобы связать временное значение cookie с текущим документом, достаточно присвоить его свойству

<b>cookie</b>
строку следующего формата:

<b>имя=значение</b>

Например:

<b>document.cookie = &quot;version=&quot; + encodeURIComponent(document.lastModified);</b>

При следующем чтении свойства

<b>cookie</b>
сохраненная пара имя/значение будет включена в список cookies документа. Значения cookie не могут содержать точки с запятой, запятые или пробельные символы. По этой причине для кодирования значения перед сохранением его в cookie, возможно, потребуется использовать глобальную JavaScript-функцию
<b>encodeURIComponent().</b>
В этом случае при чтении значения cookie надо будет вызвать соответствующую функцию
<b>decodeURIComponent().</b>

Записанный таким способом cookie сохраняется в течение сеанса работы веб-броузера, но теряется при его закрытии пользователем. Чтобы создать cookie, сохраняющийся между сеансами броузера, необходимо указать срок его хранения (в секундах) с помощью атрибута

<b>max-age</b>
. Это можно сделать, присвоив свойству cookie строку следующего формата:

<b>имя=значение; max-аgе=число_ секунд</b>

Следующая функция устанавливает cookie с дополнительным атрибутом

<b>max-аgе</b>
:

<b>// Сохраняет пару имя/значение в виде cookie, кодируя значение с помощью </b>

<b>// encodeURIComponent(), чтобы экранировать точки с запятой, запятые и пробелы.</b>

<b>// Если в параметре daysToLive передается число, атрибут max-age </b>

<b>// устанавливается так, что срок хранения cookie истекает через </b>

<b>// указанное число дней. Если передать значение 0, cookie будет удален, </b>

<b>function setCookie(name, value, daysToLive) {</b>

<b>  var cookie = name + &quot;=&quot; + encodeURIComponent(value); </b>

<b>  if (typeof daysToLive === &quot;number&quot;)</b>

<b>  cookie += max-age=&quot; + (daysToLive*60*60*24);</b>

<b>  document.cookie = cookie;</b>

<b>}</b>

Аналогичным образом можно установить атрибуты path, domain и secure, дописав к значению cookie строки следующего формата перед его записью в свойство cookie:

<b>; path=путь</b>

<b>; domain=домен </b>

<b>; secure</b>

Чтобы изменить значение cookie, установите его значение снова, указав то же имя, путь, домен и новое значение. При изменении значения cookie можно также переопределить срок его хранения, указав новое значение в атрибуте

<b>max-age</b>
.

Чтобы удалить cookie, установите его снова, указав то же имя, путь, домен и любое произвольное (возможно пустое) значение, а в атрибут

<b>max-age</b>
запишите 0.

20.2.3. Чтение cookies

Когда свойство

<b>cookie</b>
используется в JavaScript-выражении, возвращаемое им значение содержит все cookies, относящиеся к текущему документу. Эта строка представляет собой список пар имя = значение, разделенных точками с запятой и пробелами. Значение не включает какие-либо атрибуты, которые могли быть установлены для cookie. При работе со свойством
<b>document.cookie</b>
обычно приходится использовать метод
<b>split(),</b>
чтобы разбить его значение на отдельные пары имя/значение.

После извлечения значения cookie из свойства

<b>cookie</b>
его требуется интерпретировать, основываясь на том формате или кодировке, которые были указаны создателем cookie. Например, cookie можно передать функции
<b>decodeURIComponent(),</b>
а затем функции
<b>JSON.parse().</b>

В примере 20.1 определяется функция

<b>getCookie(),</b>
которая анализирует свойство
<b>document.cookie</b>
и возвращает объект, свойства которого соответствуют парам имя/значение всех cookies в документе.

Пример 20.1. Анализ свойства

<b>document.cookie</b>

<b>// Возвращает cookies документа в виде объекта с парами имя/значение.</b>

<b>// Предполагается, что значения cookie кодируются с помощью</b>

<b>// функции encodeURIComponent().</b>

<b>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;; &quot;); // Разбить на пары имя/значение</b>

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

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

<b>    var p = cookie.indexOf(”=&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>