Перегляд localStorage у HTML5 та JavaScript


92

Отже, я думав, що можу просто прокрутити localStorage як звичайний об’єкт, оскільки він має довжину. Як я можу пройти через це?

localStorage.setItem(1,'Lorem');
localStorage.setItem(2,'Ipsum');
localStorage.setItem(3,'Dolor');

Якщо я роблю a, localStorage.lengthвін повертається, 3що є правильним. Тому я вважаю, що for...inцикл буде працювати.

Я думав приблизно так:

for (x in localStorage){
    console.log(localStorage[x]);
}

Але безрезультатно. Будь-які ідеї?

Інша ідея у мене була приблизно така

localStorage.setItem(1,'Lorem|Ipsum|Dolor')
var split_list = localStorage.getItem(1).split('|');

У якому все-таки for...inпрацює.


Відповіді:


143

Ви можете використовувати keyметод. localStorage.key(index)повертає indexключ th (порядок визначається реалізацією, але постійний, доки ви не додасте або не видалите ключі).

for (var i = 0; i < localStorage.length; i++){
    $('body').append(localStorage.getItem(localStorage.key(i)));
}

Якщо порядок має значення, ви можете зберегти серіалізований масив JSON:

localStorage.setItem("words", JSON.stringify(["Lorem", "Ipsum", "Dolor"]));

Проект специфікації стверджує, що будь-який об'єкт, який підтримує структурований клон, може бути цінністю. Але це, схоже, ще не підтримується.

EDIT: Щоб завантажити масив, додайте до нього, а потім збережіть:

var words = JSON.parse(localStorage.getItem("words"));
words.push("hello");
localStorage.setItem("words", JSON.stringify(words));

Дуже дякую! Це саме те, що я шукав. Я також розгляну справу, яку ви надіслали у форматі JSON. Це було б ідеально. Це для додатка iOS для дітей у режимі офлайн HTML5 для iOS.
Оскар Годсон,

Швидке запитання, як я можу додати до цього JSON? Мовляв, як би я додав "привіт" після "Долор"?
Оскар Годсон,

1
ви рок, просто дивлячись, це має спрацювати. Чи є причина, чому я повинен використовувати синтаксичний аналіз, а не оцінювати? Зараз я використовую eval, щоб отримати його з рядка, але аналіз краще / швидше?
Оскар Годсон,

1
@Oscar, parseє більш безпечним, оскільки захищає вас від виконання коду. І часто це також набагато швидше. Дивіться blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31
Метью Флашен

1
@BBagi, він повертає будь-який вхід, декодований. Верхній рівень тексту JSON може бути об'єктом або масивом. СпробуйтеJSON.parse('["Lorem", "Ipsum", "Dolor"]').length
Метью Флашен

32

Найпростіший спосіб:

Object.keys(localStorage).forEach(function(key){
   console.log(localStorage.getItem(key));
});

24

На додаток до всіх інших відповідей, ви можете використовувати функцію $ .each з бібліотеки jQuery:

$.each(localStorage, function(key, value){

  // key magic
  // value magic

});

Зрештою, отримайте об’єкт за допомогою:

JSON .parse (localStorage.getItem (localStorage.key (ключ)));


2
Це працює, лише якщо ви використовуєте jQuery. $використовується для інших бібліотек, а також часто використовується як псевдонім для document.querySelectorAll. Питання також не позначено як [jquery] питання.
AnnanFay

9

Це працює для мене в Chrome:

for(var key in localStorage) {
  $('body').append(localStorage.getItem(key));
}

1
Яка саме частина? Цей фрагмент використовує jQuery відповідно до вихідного запитання. Чи можете ви спробувати це в консолі chrome js? for(var key in localStorage) { console.log(localStorage.getItem(key)); }
jtblin

@jtblin Я щойно спробував, він повернувся TypeError: Cannot call method 'toString' of null, тому я припускаю, що 'key' повертає нуль
Хуан Карлос Альпізар Шиншилла

1
Це працює в останніх версіях Chrome, Safari та Firefox
mndrix

1
@JuanCarlosAlpizarChinchilla у коді немає 'toString', тому ¯_ (ツ) _ / ¯. Як зазначено у коментарі вище, чудово працює у всіх останніх браузерах.
jtblin

@jtblin моєму коментарю два роки, тому ¯_ (ツ) _ / ¯ хоч дякую за голову
Хуан Карлос Альпізар Шиншила

1

Спираючись на попередню відповідь, тут є функція, яка буде проходити по локальному сховищу за ключем, не знаючи значень ключа.

function showItemsByKey() {
   var typeofKey = null;
   for (var key in localStorage) {
       typeofKey = (typeof localStorage[key]);
       console.log(key, typeofKey);
   }
}

Якщо ви вивчите вихідні дані консолі, ви побачите, що елементи, додані вашим кодом, мають рядок typeof. Тоді як вбудовані елементи є або функціями {[власний код]}, або у випадку властивості length - числом. Ви можете використовувати змінну typeofKey для фільтрації лише по рядках, щоб відображалися лише ваші елементи.

Зауважте, це працює, навіть якщо ви зберігаєте число або логічне значення як значення, оскільки обидва вони зберігаються як рядки.


1

Усі ці відповіді ігнорують відмінності між реалізаціями localStorage у браузерах. Співавтори в цьому домені повинні добре оцінювати свої відповіді на платформах, які вони описують. Одне впровадження в усьому браузері задокументоване за адресою https://developer.mozilla.org/en/docs/Web/API/Window/localStorage і, хоча і дуже потужне, містить лише кілька основних методів. Перегляд вмісту вимагає розуміння реалізації, характерної для окремих браузерів.


Не могли б ви навести приклад того, як одна з цих відповідей не працювала б у браузері? Це було дуже давно, але я не пам’ятаю, щоб виникали проблеми із циклічним переглядом цих відповідей
Оскар Годсон

Я передбачав, що мій коментар буде доданий до загального потоку, а не до цього конкретного повідомлення, і, можливо, він був трохи жорстким. Я був розчарований тим часом, намагаючись знайти крос-браузерне рішення. Приклад Стіва Ізенберга (нижче), що містить for (ключ ключа в localStorage) {typeofKey = (typeof localStorage [ключ]); console.log (ключ, typeofKey); } Не працює на реалізаціях webKit (спробуйте!)
StarTraX

Це працює: for (var i = 0; i <localStorage.length; ++ i) {console.log (localStorage.key (i) + ":" + localStorage.getItem (localStorage.key (i))); }
StarTraX

1

localStorageє Object.

Ми можемо прокручувати його за допомогою JavaScript для / in Statement, як і будь-який інший об'єкт.

І ми будемо використовувати .getItem()для доступу до значення кожного ключа (x).

for (x in localStorage){
    console.log(localStorage.getItem(x));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.