Благодарю. К сожалению, похоже, что он будет поддерживать меньше браузеров, чем @ josh3736, предложивший PersistJS. Я все еще посмотрю на это и ценю предложение.

библиотеки JavaScript и код, который может имитироватьlocalStorage в браузерах, которые не имеют встроенной поддержки.

По сути, я хотел бы закодировать свой сайт, используяlocalStorage хранить данные и знать, что они по-прежнему будут работать в браузерах, которые их изначально не поддерживают. Это будет означать, что библиотека обнаружит, еслиwindow.localStorage существует и используйте его, если он есть. Если он не существует, он создаст какой-то резервный метод локального хранилища, создав собственную реализацию вwindow.localStorage Пространство имен.

Пока я нашел эти решения:

простоsessionStorage реализация.Реализациякоторый использует куки (не в восторге от этой идеи).додзёdojox.storage, но это его собственная вещь, а не запасной вариант.

Я понимаю, что Flash и Silverlight также могут быть использованы для локального хранения, но не нашел ничего, что могло бы использовать их как запасной вариант для стандартного HTML5 localStorage. Возможно, Google Gears тоже имеет такую ​​возможность?

Пожалуйста, поделитесь любыми связанными библиотеками, ресурсами или фрагментами кода, которые вы нашли! Я был бы особенно заинтересован в чисто javascript или jquery-решениях, но думаю, что это маловероятно.

 rlovtang14 янв. 2011 г., 19:26
sessionStorage и localStorage являются частью спецификации веб-хранилища (dev.w3.org/html5/webstorage). Разница лишь в том, как долго браузер будет хранить данные. Я думаю, вы не найдете реализацию, где у вас есть одно, а не другое (но я не уверен на 100%)
 rlovtang15 янв. 2011 г., 10:17
так что я был на самом деле не прав :) Не знал, что в Chrome когда-то была поддержка localStorage, но не sessionStorage. По крайней мере, в Chrome есть поддержка обоих.
 Tauren15 янв. 2011 г., 02:00
@rlovtang: спасибо, я знаю разницу между сессией и локальным хранилищем. Согласно статье 24ways.org (первая ссылка, вопрос № 1), Chrome поддерживает только localStorage, а не sessionStorage. Возможно, это уже не так, поскольку эта статья была написана некоторое время назад.
 Tauren15 янв. 2011 г., 02:01
@ josh3736: да, я бы лично хотел избежать использования файлов cookie и механизмов. Я, конечно, не стал бы строить что-либо зависящее от него, но если бы это был запасной механизм хранения для кого-то, кто его установил, и я не кодировал непосредственно к нему, его можно было бы использовать.
 josh373614 янв. 2011 г., 21:36
Стоит отметить, что Gears былофициально обесценен в феврале прошлого года - Я бы не стал ничего строить на этом.

Ответы на вопрос(9)

amplify.js, В прошлом это работало очень хорошо для меня, и я рекомендовал это для всех локальных потребностей хранения.

поддерживает IE 5+, Firefox 2+, Safari 4+, Chrome, Opera 10.5+, iPhone 2+, Android 2+ и предоставляет согласованный API для работы с кросс-браузерным хранилищем

Решение Вопроса

PersistJS (GitHub хранилище), что позволяет легко и прозрачно обрабатывать хранилище на стороне вашего кода. Вы используете один API и получаете поддержку следующих бэкэндов:

Вспышка: Flash 8 постоянного хранения.gears: постоянное хранилище на основе Google Gears.localstorage: хранилище черновиков HTML5.whatwg_db: черновое хранилище базы данных HTML5.globalstorage: хранилище черновиков HTML5 (старая спецификация).то есть: поведение пользовательских данных Internet Explorer.cookie: постоянное хранилище на основе cookie.

Любой из них можно отключить, например, если вы не хотите использовать куки. С этой библиотекой вы получите встроенную поддержку хранилища на стороне клиента в IE 5.5+, Firefox 2.0+, Safari 3.1+ и Chrome; и поддержка плагинов, если в браузере есть Flash или Gears. Если вы включите файлы cookie, они будут работать во всем (но будут ограничены 4 КБ).

 dude21 июл. 2015 г., 13:14
Это очень смелая библиотека. Не зная о максимальном размере в большинстве технологий, мы должны быть уверены, что наше приложение работает с большой удачей ... Кроме того, это кажется единственным решением, если вы хотите сэкономить <64 КБ.
 jcalfee31420 февр. 2014 г., 16:35
PersistJS все еще поддерживается? Мне интересно, как это решает проблему, когда браузер обновляется и изменяется выбранный способ хранения (скажем, становится доступным локальное хранилище). Старое место становится недоступным?
 Mahn24 дек. 2014 г., 14:28
По крайней мере, это больше не похоже на активное развитие.
 William21 янв. 2016 г., 00:43
@julmot Для этого и нужна библиотека. Обеспечьте удобство, абстрагируясь от утомительного материала. При достаточном количестве исследований и времени вы обычно можете выяснить, как заставить это работать, независимо от максимального размера. Конечно, похоже, что автор этого проекта решил, что это слишком много ...
 Austin12 сент. 2016 г., 22:39
Знаете ли вы, работает ли это в режиме приватного просмотра Safari? В настоящее время у меня возникла проблема, когда localStorage не поддерживается в Safari Private Browsing как для MacOS, так и для iOS.

Шезлонге кажется, тоже хорошая альтернатива

шезлонг - это как диван, за исключением меньшего размера и снаружи. идеально подходит для мобильных приложений html5, которым требуется легкое, адаптивное, простое и элегантное решение для обеспечения устойчивости.

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

Страница MDN для хранения DOM дает несколько обходных путей, которые используют куки.

в котором весь его код инкапсулирован в локальной области видимости.

Я удалил ссылки, которые создают глобальныйret переменная, а также удалил синтаксический анализ сохраненных строк «истина» и «ложь» в логические значения внутриBrowserStorage.get() метод, который может вызвать проблемы, если кто-то пытается сохранить строки «true» или «false».

Поскольку API локального хранилища поддерживает только строковые значения, можно по-прежнему сохранять / извлекать данные переменных JavaScript вместе с их соответствующими типами данных, кодируя указанные данные в строку JSON, которую затем можно декодировать с использованием библиотеки кодирования / декодирования JSON, такой какhttps://github.com/douglascrockford/JSON-js

var BrowserStorage = (function() {
    /**
     * Whether the current browser supports local storage as a way of storing data
     * @var {Boolean}
     */
    var _hasLocalStorageSupport = (function() {
        try {
            return 'localStorage' in window && window['localStorage'] !== null;
        } catch (e) {
            return false;
        }
    })();

    /**
     * @param {String} name The name of the property to read from this document's cookies
     * @return {?String} The specified cookie property's value (or null if it has not been set)
     */
    var _readCookie = function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }

        return null;
    };

    /**
     * @param {String} name The name of the property to set by writing to a cookie
     * @param {String} value The value to use when setting the specified property
     * @param {int} [days] The number of days until the storage of this item expires
     */
    var _writeCookie = function(name, value, days) {
        var expiration = (function() {
            if (days) {
                var date = new Date();
                date.setTime(date.getTime() + (days*24*60*60*1000));
                return "; expires=" + date.toGMTString();
            }
            else {
                return "";
            }
        })();

        document.cookie = name + "=" + value + expiration + "; path=/";
    };

    return {
        /**
         * @param {String} name The name of the property to set
         * @param {String} value The value to use when setting the specified property
         * @param {int} [days] The number of days until the storage of this item expires (if storage of the provided item must fallback to using cookies)
         */
        set: function(name, value, days) {
            _hasLocalStorageSupport
                ? localStorage.setItem(name, value)
                : _writeCookie(name, value, days);
        },

        /**
         * @param {String} name The name of the value to retrieve
         * @return {?String} The value of the 
         */
        get: function(name) {
            return _hasLocalStorageSupport
                ? localStorage.getItem(name) 
                : _readCookie(name);
        },

        /**
         * @param {String} name The name of the value to delete/remove from storage
         */
        remove: function(name) {
            _hasLocalStorageSupport
                ? localStorage.removeItem(name)
                : this.set(name, "", -1);
        }
    };
})();

https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills

поищите раздел веб-хранилища на этой странице, и вы увидите 10 потенциальных решений (по состоянию на июль 2011 года).

удачи! отметка

 Alex Klaus10 янв. 2017 г., 02:00
Кажется, что ни один из них не работает в режиме Private / Incognito (например, Safari или Chrome), поскольку их обходной путь - создание файлов cookie, которые также отключены в этом режиме.

realstorage, который использует Gears как запасной вариант.

 Tauren15 янв. 2011 г., 01:56
Благодарю. К сожалению, похоже, что он будет поддерживать меньше браузеров, чем @ josh3736, предложивший PersistJS. Я все еще посмотрю на это и ценю предложение.

Демо-версия:http://jsfiddle.net/aamir/S4X35/

HTML:

<a href='#' onclick="store.set('foo','bar')">set key: foo, with value: bar</a><br/>
<a href='#' onclick="alert(store.get('foo'))">get key: foo</a><br/>
<a href='#' onclick="store.del('foo')">delete key: foo</a>​

JS:

window.store = {
    localStoreSupport: function() {
        try {
            return 'localStorage' in window && window['localStorage'] !== null;
        } catch (e) {
            return false;
        }
    },
    set: function(name,value,days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }
        else {
            var expires = "";
        }
        if( this.localStoreSupport() ) {
            localStorage.setItem(name, value);
        }
        else {
            document.cookie = name+"="+value+expires+"; path=/";
        }
    },
    get: function(name) {
        if( this.localStoreSupport() ) {
            var ret = localStorage.getItem(name);
            //console.log(typeof ret);
            switch (ret) {
              case 'true': 
                  return true;
              case 'false':
                  return false;
              default:
                  return ret;
            }
        }
        else {
            // cookie fallback
            /*
             * after adding a cookie like
             * >> document.cookie = "bar=test; expires=Thu, 14 Jun 2018 13:05:38 GMT; path=/"
             * the value of document.cookie may look like
             * >> "foo=value; bar=test"
             */
            var nameEQ = name + "=";  // what we are looking for
            var ca = document.cookie.split(';');  // split into separate cookies
            for(var i=0;i < ca.length;i++) {
                var c = ca[i];  // the current cookie
                while (c.charAt(0)==' ') c = c.substring(1,c.length);  // remove leading spaces
                if (c.indexOf(nameEQ) == 0) {  // if it is the searched cookie
                    var ret = c.substring(nameEQ.length,c.length);
                    // making "true" and "false" a boolean again.
                    switch (ret) {
                      case 'true':
                          return true;
                      case 'false':
                          return false;
                      default:
                          return ret;
                    }
                }
            }
            return null; // no cookie found
        }
    },
    del: function(name) {
        if( this.localStoreSupport() ) {
            localStorage.removeItem(name);
        }
        else {
            this.set(name,"",-1);
        }
    }
}​
 Aamir Afridi21 янв. 2015 г., 16:07
@MohsinSaeed в приватном режиме, я думаю, браузер не позволит вам создавать куки тоже.superuser.com/questions/589248/...
 Robert30 июл. 2013 г., 20:42
Почему это не получает признание !? Спасибо чувак!
 happy_marmoset12 нояб. 2013 г., 14:44
это разрешено в JavaScript, чтобы определитьvar expires локально, а затем пользователь в другой области? в функцииset
 Hanna09 дек. 2014 г., 18:31
Просто хотел отметить, что, хотя вы разрешаете устанавливать срок действия cookie, у localStorage никогда не будет срока действия. Это может вызвать некоторые проблемы, если вы ищете что-то срок действия. Может быть полезно добавить дату окончания срока действия в локальное хранилище, а затем сделать сравнение дат, чтобы увидеть, все ли еще применимо. Конечно, я бы также сказал, что вы должны просто использовать куки, если вам нужно истечение срока действия. Но я думаю, что этот сценарий должен либо не допустить истечения срока действия, либо разрешить его для обоих, а не быть непоследовательным, как в настоящее время.
 Aamir Afridi09 сент. 2013 г., 18:23
:) - Мне не нравится добавлять целую библиотеку для всего, что мне нужно.

Он не пытается сделать что-то слишком сложное

Нет куки, нет вспышки, нет JQuery не требуется.

Чистый API.

5 кб сжатый

https://github.com/marcuswestin/store.js

Ваш ответ на вопрос