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());
Ваш пример в ИЕ8 выдает ошибку «Член группы не найден» в строке «localStorage = localStorage || new function () {». в ФФ код также не рабочий. Я так понимаю, что надо сначала проверять версию, и если найден старый ослик, то загружать вашу функцию? Спасибо.
Спасибо! А можете полностью привести пример кода, который не заработал? Я проверял на IE8, может быть какой-то случай не учёл?
Какой код в ФФ не рабочий? Моей библиотеки или который в заметке? Какая версия FF?
Комментарий для Евгения Степанищева:
Для меня вообще загадка как оно могло работать. Вот так работает:
localStorageNew = localStorage || new function ()
и дальше по тексту ставим везде localStorageNew, и в примере тоже. То есть если функции localStorage не существует, то работает ваш код под именем localStorageNew, а если существует, то она присваивается localStorageNew.
Я пробовал на сафари, опере, ие8 и лисе 3.6, нигде нельзя сделать как у вас localStorage = localStorage ..., ну не работает и все! У меня ХРюша, хотя это не важно )
Комментарий для Евгений:
Я не понимаю в чём загадка. Если localStorage существует, то он и присваивается localStorage, если нет, то присваивается новый объект.
Тьфу, чёрт. Смотрю в книгу, вижу фигу :)
Там надо исправить вот так:
window.localStorage = window.localStorage || …
я как раз искал такого типа класс, пробовал в через IETester — то ругается, нашел аналогичный https://github.com/wojodesign/local-storage-js
Комментарий для Павел:
У меня работал. Кроме того, у меня нормальная реализация очистки хранилища и подсчёта длины. В отличие от варианта, на который вы ссылаетесь.