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

Во второй строке в примере выше выполняется безуспешная попытка присвоить новое значение свойству хранящегося объекта, потому что интерпретатор сначала извлечет копию хранящегося объекта, присвоит свойству копии новое значение и затем удалит копию. В результате изменения не коснутся хранящегося объекта. Меньше шансов ошибиться, если использовать метод

<b>getltem():</b>

<b>localStorage.getItem(&quot;о&quot;).x = 2; // He предполагает сохранение значения 2</b>

Наконец, еще одна причина отдать предпочтение более явному прикладному интерфейсу на основе методов заключается в возможности имитировать этот прикладной интерфейс поверх других механизмов сохранения данных в броузерах, которые пока не поддерживают спецификацию «Web Storage». В следующих разделах будут представлены примеры реализации интерфейса объекта

<b>Storage</b>
с применением cookies и userData в ІE. При использовании прикладного интерфейса на основе методов можно писать программный код, который будет использовать свойство
<b>localStorage</b>
, когда оно доступно, и возвращаться к использованию других механизмов в противном случае. Такой программный код мог бы начинаться следующими строками:

<b>// Определить, какой механизм хранения будет использоваться </b>

<b>var memory = window.localStorage ||</b>

<b>  (window.UserDataStorage &amp;&amp; new UserDataStorage()) || new CookieStorage();</b>

<b>// Затем отыскать требуемый элемент в хранилище </b>

<b>var username = memory.getltem(&quot;username&quot;);</b>

20.1.3. События объекта Storage

При изменении данных, хранящихся в

<b>localStorage</b>
или
<b>sessionStorage</b>
, броузер генерирует событие «storage» во всех объектах
<b>Window</b>
, в которых доступны эти данные (но не в окне, где выполнялось сохранение). Если в броузере открыты две вкладки со страницами с общим происхождением и в одной из страниц производится сохранение значения в
<b>localStorage</b>
, в другой вкладке будет сгенерировано событие «storage». Не забывайте, что область видимости данных, хранящихся в
<b>sessionStorage</b>
, ограничивается окном верхнего уровня, поэтому при изменении данных в
<b>sessionStorage</b>
события «storage» будут генерироваться только при наличии нескольких фреймов. Обратите также внимание, что события «storage» генерируются, только когда содержимое хранилища действительно изменяется. Присваивание хранимому элементу его текущего значения, как и попытка удалить несуществующий элемент, не возбуждают событие.

Регистрация обработчиков события «storage» выполняется с помощью метода

<b>addEventListener()</b>
(или
<b>attachEvent()</b>
в IE). В большинстве броузеров для этой цели можно также использовать свойство
<b>onstorage</b>
объекта
<b>Window</b>
, но на момент написания этих строк данное свойство не поддерживалось в Firefox.

Объект события, связанный с событием «storage», имеет пять основных свойств (к сожалению, они не поддерживаются в IE8):

<b>key</b>

Имя или ключ сохраняемого или удаляемого элемента. Если был вызван метод

<b>сlеаг(),</b>
это свойство будет иметь значение null.

<b>newValue</b>

Новое значение элемента или null, еслибыл вызван метод

<b>removeItem().</b>

<b>oldValue</b>

Старое значение существующего элемента, изменившегося или удаленного, или значение null, если был создан новый элемент.

<b>storageArea</b>

Это свойство будет хранить значение свойства

<b>localStorage</b>
или
<b>sessionStorage</b>
целевого объекта
<b>Window</b>
.

<b>url</b>

URL-адрес (в виде строки) документа, сценарий которого выполнил операцию с хранилищем.

Наконец, обратите внимание, что объект

<b>localStorage</b>
и событие «storage» могут служить широковещательным механизмом, с помощью которого броузер может отправлять сообщения всем окнам, в которых в настоящий момент открыт один и тот же веб-сайт. Например, если пользователь потребует от веб-сайта прекратить воспроизводить анимационные эффекты, сценарий может сохранить соответствующий параметр настройки в
<b>localStorage</b>
, чтобы соблюсти это требование при последующих посещениях сайта. При сохранении параметра будет сгенерировано событие, что позволит другим окнам, отображающим тот же сайт, также удовлетворить это требование. В качестве другого примера представьте веб-приложение графического редактора, позволяющее пользователю отображать палитры с инструментами в отдельных окнах. При выборе пользователем некоторого инструмента приложение могло бы сохранять в
<b>localStorage</b>
признак выбранного инструмента и тем самым рассылать другим окнам извещения о том, что был выбран новый инструмент.

20.2. Cookies

Cookies - это небольшие фрагменты именованных данных, сохраняемые веб-броузером и связанные с определенными веб-страницами или веб-сайтами. Cookies первоначально предназначались для разработки серверных сценариев и на низшем уровне реализованы как расширение протокола HTTP. Данные в cookies автоматически передаются между веб-броузером и веб-сервером, благодаря чему серверные сценарии могут читать и записывать значения, сохраняемые на стороне клиента. В этом разделе будет показано, как клиентские сценарии могут работать с cookies, используя свойство

<b>cookie</b>
объекта
<b>Document</b>
.

Прикладной интерфейс для работы с cookies является одним из старейших, а это означает, что он поддерживается всеми броузерами. К сожалению, этот прикладной интерфейс слишком замысловат. В нем отсутствуют методы: операции чтения, записи и удаления cookies осуществляются с помощью свойства

<b>cookie</b>
объекта
<b>Document</b>
с применением строк специального формата. Срок хранения и область видимости можно указать отдельно для каждого
<b>cookie</b>
с помощью атрибутов. Эти атрибуты также определяются посредством записи строк специального формата в то же самое свойство
<b>cookie</b>
.