Как хранить постоянные данные на стороне клиента

Мне нужно программно хранить данные на стороне клиента без необходимости передавать данные с сервера при каждой загрузке страницы. Я думал создать динамический файл JavaScript с необходимыми данными для текущего сеанса пользователя и убедиться, что он кэширован, но это кажется очень грязным, и у такого подхода есть несколько недостатков, которые я могу придумать.

Как я могу хранить постоянные данные на стороне клиента?


person Itay Moav -Malimovka    schedule 03.04.2009    source источник
comment
Возможный дубликат сохранять переменные между загрузками страницы   -  person Liam    schedule 10.12.2018


Ответы (5)


Вы можете хранить данные в window.name, который может содержать до 2 МБ данных (!).

/* on page 1 */
window.name = "Bla bla bla";

/* on page 2 */
alert(window.name); // alerts "Bla bla bla"

Изменить: Также ознакомьтесь с этой статьей об Ajaxian. в соответствии с этим.

Обратите внимание, что другие сайты в той же вкладке/окне также имеют доступ к window.name, поэтому здесь не следует хранить ничего конфиденциального.

person moff    schedule 03.04.2009
comment
Кажется, что у этого метода есть некоторые проблемы с безопасностью. Вы использовали его раньше? Какие-либо потенциальные проблемы, которые вы обнаружили? - person Neil Aitken; 03.04.2009
comment
Да, я использовал его (в основном для кэширования). Другие сайты в той же вкладке/окне могут читать или записывать имя окна, так что это не совсем безопасное место для хранения данных, но для кэширования и тому подобного, я думаю, это здорово. - person moff; 03.04.2009
comment
Эти другие сайты также могут просто перезаписать ваши данные, так что это тоже не очень надежно. - person Joel Coehoorn; 03.04.2009
comment
Любая идея о том, насколько это совместимо (например, требуется минимальный браузер, мобильный телефон и т. д.)? - person ashes999; 01.03.2014
comment
С появлением API веб-хранилища этот ответ теперь массово устарел. Даже когда был дан этот ответ, это была очень плохая идея. Свойство window.name не предназначено для хранения состояния. - person Rory McCrossan; 25.03.2019

Вы можете использовать API веб-хранилища (Window.localStorage или Window.sessionStorage). Ознакомьтесь с эту статью на html5doctor для более подробного объяснения. API веб-хранилища — это поддерживается всеми современными браузерами на данный момент.

Доступное только для чтения свойство localStorage позволяет вам получить доступ к объекту Storage для источника документа; сохраненные данные сохраняются между сеансами браузера. localStorage аналогичен sessionStorage, за исключением того, что данные, хранящиеся в localStorage, не имеют срока действия, данные, хранящиеся в sessionStorage, очищаются по завершении сеанса страницы, то есть при закрытии страницы.
< sup>https://developer.mozilla.org/en/docs/Web/API/Window/localStorage

Как подчеркнуто выше:

Существует два метода установки и получения свойств через Window.localStorage и Window.sessionStorage API:

  1. Доступ к свойствам напрямую:

    localStorage.name = 'ashes999';
    console.log(localStorage.name); // ashes999
    delete localStorage.name;
    console.log(localStorage.name); // undefined
    
    sessionStorage.name = 'ashes999';
    console.log(sessionStorage.name); // ashes999
    delete sessionStorage.name;
    console.log(sessionStorage.name); // undefined
    
  2. Используйте Storage.setItem, Storage.getItem и Storage.removeItem методов API.

    localStorage.setItem('name', 'ashes999');
    console.log(localStorage.getItem('name')); // ashes999
    localStorage.removeItem('name');
    console.log(localStorage.getItem('name')); // undefined
    
    sessionStorage.setItem('name', 'ashes999');
    console.log(sessionStorage.getItem('name')); // ashes999
    sessionStorage.removeItem('name');
    console.log(sessionStorage.getItem('name')); // undefined
    

Предостережения:

  • Браузеры могут налагать ограничения на емкость хранилища для каждого источника API веб-хранилища, но вы должны быть в безопасности до 5 МБ.
  • API веб-хранилища ограничен той же политикой происхождения.
  • Доступ к веб-хранилищу из сторонних IFrames запрещен, если пользователь отключил сторонние файлы cookie в Firefox.
person ashes999    schedule 01.03.2014
comment
Я отредактировал, чтобы немного расширить ваш ответ здесь, поскольку на данный момент это наиболее легко находимая повторяющаяся цель, а метод API веб-хранилища был немного недопредставлен. Если мои правки сильно отклонились от первоначального замысла вашего ответа или оказались вредными, пожалуйста, откатите их. - person ; 17.08.2017
comment
@TinyGiant Я думаю, вы в значительной степени переписали мой ответ. Я бы предпочел, чтобы вы опубликовали это как свое собственное (и получили за это признание своего представителя); особенно учитывая, что на данный момент это не принятый и не получивший наибольшее количество голосов ответ. Если вы чувствуете, что это слишком много, не беспокойтесь, я не буду откатывать его назад. - person ashes999; 17.08.2017
comment
Мне не хочется добавлять еще один ответ, говорящий о том, что уже было сказано здесь. Я не очень забочусь о репутации, полученной от этого. Меня просто волнует полезность вопросов и ответов здесь, в Stack Overflow. - person ; 17.08.2017
comment
@TinyGiant хорошо, тогда я думаю, мы согласны оставить все как есть. Спасибо, что дал мне знать. - person ashes999; 18.08.2017

Если вам действительно нужно это сделать (и я определенно сомневаюсь, что это вообще хорошая идея), ваша идея с дополнительным файлом javascript не так плоха, как вы думаете. Просто используйте нотацию JSON для хранения данных, и их довольно легко загружать и выгружать по мере необходимости. Если вы сохраните некоторые хорошо продуманные логические подразделения, вы также сможете обновлять только их части по запросу.

person Joel Coehoorn    schedule 03.04.2009
comment
@ Itay Я отредактировал этот вопрос, потому что он используется в качестве дублирующей цели для новых вопросов, и я посчитал, что он нуждается в некоторой очистке и организации. - person ; 17.08.2017
comment
@TinyGiant Правда? Это страшно. Информация в большинстве ответов здесь несколько устарела, учитывая, что локальное хранилище html5 теперь довольно безопасно для использования. - person Joel Coehoorn; 18.08.2017
comment
@Joel, поэтому я расширил ответ API веб-хранилища. Если вы заметили здесь что-то, что можно улучшить с помощью редактирования, и чувствуете себя готовым к задаче, пожалуйста, найдите время, чтобы сделать это. - person ; 18.08.2017

Как насчет Google Gears. Это сделано для автономного хранения, но я думаю, что это может сработать. http://code.google.com/apis/gears/design.html

Из документации:

Хранение данных пользователя

Приложения, которые представляют собой нечто большее, чем просто статические файлы, имеют данные, которые обычно хранятся на сервере. Чтобы приложение можно было использовать в автономном режиме, эти данные должны быть доступны локально. Модуль базы данных предоставляет реляционную базу данных для хранения данных. На странице «Архитектура» вы найдете обсуждение стратегий проектирования локального хранилища, необходимого вашему приложению.

При повторном подключении автономного приложения вам потребуется синхронизировать любые изменения, внесенные в локальную базу данных, с сервером. Существует множество различных подходов к синхронизации данных, и единого идеального подхода не существует. На странице «Архитектура» описаны некоторые стратегии синхронизации.

Дополнительной функцией базы данных Gears является полнотекстовый поиск, обеспечивающий быстрый способ поиска текста в файле базы данных. Подробнее читайте здесь.

person Martin    schedule 03.04.2009
comment
Требуется дополнительный компонент, установленный в браузере, что нарушает одно из его требований. - person Joel Coehoorn; 04.04.2009
comment
Вау, это хорошо, только что проголосовали за ответ 8-летней давности, что имело смысл, когда на него ответили, но на данный момент совершенно не соответствует действительности. - person Martin; 22.08.2017

API веб-хранилища имеет ограничение в 5 МБ для локальное хранилище, но на стороне клиента можно хранить большие объемы данных, используя ИндекседБД. В некоторых новых браузерах также можно кэшировать данные для автономного использования с помощью Сервисные работники.

Фрагменты URL также могут хранить данные на стороне клиента, хотя они могут хранить только несколько тысяч символов в большинстве браузеров.

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

person Anderson Green    schedule 05.02.2021