Хранение данных
• 201
ПРИМЕЧАНИЕ
Если вам хочется побольше узнать о заполнении, отправляйтесь в главу 12 Мы подождем вас
здесь
Для
localStorage
можно использовать файлы cookie, или, для лучшей поддержки, встро-
енные методы
userData
браузера, или даже объект Flash. Для
sessionStorage
используйте
заполнитель, работающий со свойством
name
объекта
window
. В
следующем фрагменте
кода показано, как воспроизвести функциональность
sessionStorage
(и гарантировать,
что данные будут доступны только текущему окну, а не «протекут» в другие, как бывает
с файлами cookie), вручную реализовав каждый из
методов API хранилища. Обратите
внимание, что в коде подразумевается, что в
вашем браузере есть поддержка JSON — либо
с помощью стандартных методов, либо через библиотеку Дугласа Крокфорда.
if (typeof sessionStorage === 'undefined') {
sessionStorage = (function () {
var data = window.top.name ? JSON.parse(window.top..
¬ name) : {};
return {
clear: function () {
data = {};
window.top.name = '';
} ,
getItem: function (key) {
return data[key] || null;
} ,
key: function (i) {
// не идеально, но работает
var ctr = 0;
for (var k in data) {
if (ctr == i) return k
else ctr++;
}
} ,
removeItem: function (key) {
delete data[key];
window.top.name = JSON.stringify(data);
} ,
setItem: function (key, value) {
data[key] = value+''; // превращаем значение
¬ в строку
window.top.name = JSON.stringify(data);
}
} ;
})();
}
202 • Глава 6
Проблема с реализацией
sessionStorage
вручную (как показано в предыдущем фрагмен-
те) заключается в том, что у
нас нет методов
setter
и
getter
(или, скорее, в том, что IE7
и более ранние версии не поддерживают их, а это, в действительности, единственный по-
пулярный устаревший браузер без встроенной поддержки
sessionStorage
). Это
означает,
что невозможно использовать, например, такой код:
sessionStorage.twitter
=
'@rem'
.
Хотя технически он сработает, он не будет правильно зарегистрирован в объекте храни-
лища, и
sessionStorage.getItem('twitter')
не вернет результата. Обойти конкретную
проблему можно, но самое главное, что обновление окна браузера приведет к утере данных.
Помня это, и в зависимости от того, для какого браузера предназначен код (имеется в виду,
нужно ли вручную реализовывать свой вариант хранилища), внутри команды разработ-
чиков обязательно стоит договориться, можно ли ограничиться только методами
getItem
и
setItem
.
Достарыңызбен бөлісу: