Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Обход элементов localStorage (https://javascript.ru/forum/events/40568-obkhod-ehlementov-localstorage.html)

berserk10 11.08.2013 13:33

Обход элементов localStorage
 
Доброго времени суток. Пишу корзину, которая будет храниться в localStorage. Во время загрузки страницы сначала получаются все ключи, по которым товар были записаны в localStorage:

function indexStorage(){
    list = [];
    for (var name in localStorage){
        list.push(name)
    }
    return list;
}


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

for (var item in indexStorage()){
        var dict = localStorage.getItem(item);
        alert(dict)
    }


С таки кодом после загрузки страницы выводится значение nullдля всех ключей. Я раньше с javascript-ом особо не сталкивался, работал только с серверной частью, а сейчас решил переписать серверный вариант корзины на javascript. Самому кажется, что ошибка примитивная и я где-то неправильно делаю обход списка, но разобраться никак не могу. Заранее благодарен за помощь.

ruslan_mart 11.08.2013 13:55

<table>
   <tbody id="backet"></tbody>
</table>

(function() {
   var td = '';
   for(var i in localStorage) if(typeof localStorage[i] == 'string') td += '<tr><td>' + i + '</td><td>' + localStorage[i] + '</td></tr>';
   document.getElementById('backet').innerHTML = td;
})();

berserk10 11.08.2013 14:03

Пара вопросов.
Насколько я понял, после условия цикла идет проверки, является ли значение ключа строкой. У меня это не строка. Я передаю объект, а точнее словарь со значением имени, цены и так далее. Нужна ли эта проверка для работы функции?
И второй вопрос. Фигурные скобки вокруг тела цикла случайно пропущены или так и должно быть?

ruslan_mart 11.08.2013 14:20

berserk10, нельзя объекты хранить в localStorage, можно либо число, либо строку.
Цитата:

Сообщение от berserk10
Фигурные скобки вокруг тела цикла случайно пропущены или так и должно быть?

Ну так же как и с if, если одна строка кода, то фигурные скобки не обязательны.

Записывайте все товары прямо в localStorage и извлекайте их кодом (см. выше).

localStorage.chocolate = '3';
localStorage.yogurt = '5';

berserk10 11.08.2013 14:25

То есть ошибка именно из-за того, что хранится объект? Значит если я правильно понял, то для каждого товара нужно либо делать несколько записей по ключам типа id-цвет-имя, id-цвет-цена, либо все записывать в строку, а потом обрабатывать её на сервере. Что-то вроде словаря хранить никак нельзя?

danik.js 11.08.2013 14:28

Цитата:

Сообщение от berserk10
У меня это не строка.

Да ты че? А ничего, что в localStorage можно хранить только строки?:D

ruslan_mart 11.08.2013 14:30

Как вариант, Вы можете передавать всё строкой:
localStorage.chocolate = 'с орехом|5 шт.|100 рублей';


А затем разбивать всё на массив и записывать в объект:
var basket = {};
for(var i in localStorage) if(typeof localStorage[i] == 'string') basket[i] = localStorage[i].split('|');

alert(basket.chocolate);

berserk10 11.08.2013 14:39

Всё понял. Спасибо за помощь.

danik.js 11.08.2013 14:55

Ruslan_xDD, зачем же велосипедить. Есть же JSON.stringify()/JSON.parse()


Часовой пояс GMT +3, время: 23:27.