Пишу, по большей части, про историю, свою жизнь и немного про программирование.

localStorage для Internet Explorer 6 и 7

Написал небольшой класс в JavaScript для поддержки API localStorage в IE 6 и 7. localStorage — это браузерное хранилище key-value. Эмулируются setItem, getItem, removeItem, key, clear и length (для хранения использует behavior userData).

Доступ к значениям как к свойствам класса не реализован. Прежде всего потому, что в JS в этих версиях IE нет сеттеров и геттеров, а для того, чтобы воспользоваться onpropertychange мой объект надо поместить в DOM, что порождает массу гемороя, типа присутствия свойств из DOM, а не из хранилища.

Так же я не сделал события onstorage и onstoragecommit, потому что не придумал для чего это нужно (а второе корректно реализовать вообще нельзя).

Ещё не реализовал нестандартное, но полезное расширение remainingSpace, потому что в общем случае нельзя сказать сколько места ещё осталось в userData, так как квота зависит от зоны сайта (доверенная, интранет и так далее).

С большой вероятностью эта зона, конечно же, «интернет» (то есть квота 1МБ), но квоты localStorage сильно отличаются по механизму от userData, у последнего две квоты — на документ (в зоне «интернет» это 128КБ) и на домен (упомянутый мегабайт). Вполне может случится, что квота «на документ» ещё не исчерпана, а доменная уже да.

Зато я реализовал exception, который бросается в том случае, если IE говорит, что квота исчерпана.

В общем, основные вещи есть. Пример использования:

// .-~*´¨¯¨`*·~-.¸ тут подключаем библиотеку ,.-~*´¨¯¨`*·~-.¸
// записываем два значения
try {
    localStorage.setItem('key1', 'myvalue1');
    localStorage.setItem('key2', 'myvalue2');
} catch (e) {
    if (e.description == 'QUOTA_EXCEEDED_ERR') {
        alert('Нет места');
    } else {
        alert('Что-то не так, не знаю что.');
    }
}

// смотрим значение по ключу «key1»
alert(localStorage.getItem('key1'));
// смотрим первое значение (по номеру), нумерация с нуля
alert(localStorage.key(0));

// удаляем значение по ключу «key1»
alert(localStorage.removeItem('key1'));

// смотрим сколько ключей осталось
alert(localStorage.length);

// очищаем хранилище полностью
alert(localStorage.clear());
6 комментариев
Евгений 2011

Ваш пример в ИЕ8 выдает ошибку «Член группы не найден» в строке «localStorage = localStorage || new function () {». в ФФ код также не рабочий. Я так понимаю, что надо сначала проверять версию, и если найден старый ослик, то загружать вашу функцию? Спасибо.

Евгений Степанищев (bolknote.ru) 2011

Ваш пример в ИЕ8 выдает ошибку «Член группы не найден» в строке «localStorage = localStorage || new function () {»

Спасибо! А можете полностью привести пример кода, который не заработал? Я проверял на IE8, может быть какой-то случай не учёл?

ФФ код также не рабочий

Какой код в ФФ не рабочий? Моей библиотеки или который в заметке? Какая версия FF?

Евгений 2011

Комментарий для Евгения Степанищева:

Для меня вообще загадка как оно могло работать. Вот так работает:

localStorageNew = localStorage || new function ()

и дальше по тексту ставим везде localStorageNew, и в примере тоже. То есть если функции localStorage не существует, то работает ваш код под именем localStorageNew, а если существует, то она присваивается localStorageNew.

Я пробовал на сафари, опере, ие8 и лисе 3.6, нигде нельзя сделать как у вас localStorage = localStorage ..., ну не работает и все! У меня ХРюша, хотя это не важно )

Евгений Степанищев (bolknote.ru) 2011

Комментарий для Евгений:

Для меня вообще загадка как оно могло работать. Вот так работает

Я не понимаю в чём загадка. Если localStorage существует, то он и присваивается localStorage, если нет, то присваивается новый объект.

Я пробовал на сафари, опере, ие8 и лисе 3.6, нигде нельзя сделать как у вас localStorage = localStorage ..., ну не работает и все! У меня ХРюша, хотя это не важно )

Тьфу, чёрт. Смотрю в книгу, вижу фигу :)

Там надо исправить вот так:

window.localStorage = window.localStorage || …

Павел 2013

я как раз искал такого типа класс, пробовал в через IETester — то ругается, нашел аналогичный https://github.com/wojodesign/local-storage-js

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Павел:

У меня работал. Кроме того, у меня нормальная реализация очистки хранилища и подсчёта длины. В отличие от варианта, на который вы ссылаетесь.