HTML5 로컬 저장소 대체 솔루션 [닫힘]


119

localStorage네이티브 지원이없는 브라우저에서 시뮬레이션 할 수있는 자바 스크립트 라이브러리와 코드를 찾고 있습니다 .

기본적으로 localStorage데이터를 저장하는 데 사용 하는 사이트를 코딩하고 기본적으로 지원하지 않는 브라우저에서도 계속 작동한다는 것을 알고 싶습니다. 이것은 라이브러리가 window.localStorage존재 하는지 감지하고 존재 하는 경우 사용 한다는 것을 의미합니다 . 존재하지 않는 경우 window.localStorage네임 스페이스에 자체 구현을 생성하여 일종의 로컬 스토리지 대체 방법을 생성 합니다.

지금까지 다음 솔루션을 찾았습니다.

  1. 간단한 sessionStorage 구현.
  2. 쿠키를 사용 하는 구현 (이 아이디어에 만족하지 않음).
  3. Dojo의 dojox.storage 이지만 실제로는 폴 백이 아니라 자체적 인 것입니다.

Flash 및 Silverlight는 로컬 저장소에도 사용할 수 있지만 표준 HTML5 localStorage의 대체 수단으로 사용하는 방법에 대해서는 아무것도 찾지 못했습니다. Google Gears에도이 기능이 있습니까?

찾은 관련 라이브러리, 리소스 또는 코드 조각을 공유하십시오! 특히 순수한 자바 스크립트 또는 jquery 기반 솔루션에 관심이 있지만 그럴 가능성은 낮습니다.


sessionStorage 및 localStorage는 모두 웹 저장소 사양 ( dev.w3.org/html5/webstorage )의 일부입니다 . 유일한 차이점은 브라우저가 데이터를 보관하는 기간입니다. 난 당신이 하나가 아닌 다른이 구현을 찾을 수 없습니다 생각 (하지만 난 100 % 아니에요 확인)
rlovtang

1
Gears가 작년 2 월공식적으로 감가 상각 되었다는 점을 언급 할 가치가 있습니다.
josh3736

@rlovtang : 감사합니다. 세션과 로컬 스토리지의 차이점을 알고 있습니다. 24ways.org 기사 (문제의 첫 번째 링크, 솔루션 # 1)에 따르면 Chrome은 sessionStorage가 아닌 localStorage 만 지원합니다. 그 기사가 얼마 전에 쓰여졌 기 때문에 아마도 그것은 더 이상 사실이 아닐 것입니다.
Tauren 2011 년

@ josh3736 : 네, 개인적으로 쿠키와 기어 사용을 피하고 싶습니다. 나는 그것에 의존하는 어떤 것도 구축하지 않을 것이지만, 그것이 그것을 설치 한 누군가를위한 대체 저장 메커니즘이고 내가 그것에 직접 코딩하지 않았다면 그것은 사용될 수있다.
Tauren 2011 년

그래서 나는 실제로 틀렸다 :) Chrome이 한때 localStorage를 지원하지만 sessionStorage는 지원하지 않는다는 것을 몰랐습니다. Chrome은 적어도 현재 둘 다 지원합니다.
rlovtang

답변:


56

저는 PersistJS ( github repository )를 사용 합니다.이 저장소 는 클라이언트 측 저장소를 코드에 대해 원활하고 투명하게 처리합니다. 단일 API를 사용하고 다음 백엔드에 대한 지원을받습니다.

  • flash : Flash 8 영구 저장소.
  • gears : Google Gears 기반 영구 저장소입니다.
  • localstorage : HTML5 임시 저장소.
  • whatwg_db : HTML5 초안 데이터베이스 저장소.
  • globalstorage : HTML5 임시 저장소 (이전 사양).
  • 즉 : Internet Explorer 사용자 데이터 동작.
  • 쿠키 : 쿠키 기반 영구 저장.

예를 들어 쿠키를 사용하지 않으려는 경우 이러한 기능을 비활성화 할 수 있습니다. 이 라이브러리를 사용하면 IE 5.5+, Firefox 2.0+, Safari 3.1+ 및 Chrome에서 기본 클라이언트 측 스토리지 지원을받을 수 있습니다. 브라우저에 Flash 또는 Gears가있는 경우 플러그인 지원 지원. 쿠키를 활성화하면 모든 곳에서 작동합니다 (그러나 4kB로 제한됨).


10
PersistJS가 계속 지원됩니까? 브라우저가 업그레이드되고 선택한 저장 방법이 변경되는 문제를 어떻게 해결하는지 궁금합니다 (예 : 로컬 저장소를 사용할 수있게 됨). 이전 위치에 액세스 할 수 없습니까?
jcalfee314

2
적어도 더 이상 활발히 개발중인 것 같지는 않습니다.
Mahn

이것은 매우 대담한 도서관입니다. 대부분의 기술에서 최대 크기에 대한 지식이 없으면 앱이 운이 좋게 실행된다는 사실을 확인해야합니다. 또한 64KB 미만을 절약하려는 경우에만 해결책 인 것 같습니다.
친구

@julmot 그게 바로 라이브러리입니다. 지루한 작업을 추상화하면서 편리함을 제공합니다. 충분한 연구와 시간을 통해 최대 크기에 관계없이 일반적으로 작동 방법을 파악할 수 있습니다. 이 프로젝트의 저자가 너무 많이라고 판단처럼 물론, 그것은 ... 보인다
윌리엄

이것이 Safari Private Browsing 모드에서 작동하는지 알고 있습니까? 현재 macOS와 iOS 모두 Safari Private Browsing에서 localStorage가 지원되지 않는 문제가 있습니다.
Austin

61

순수 JS 기반 단순 localStorage 폴리 필 :

데모 : 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);
        }
    }
}​

4
왜 이것이 인식을 얻지 못합니까!? 감사합니다!
로버트

4
:)-필요한 모든 것을 위해 전체 라이브러리를 추가하는 것을 좋아하지 않습니다.
Aamir Afridi 2013 년

2
JavaScript에서 var expires로컬 로 정의한 다음 다른 범위의 사용자 를 정의 할 수 있습니까? 기능set
happy_marmoset 2013

3
쿠키에 만료 설정을 허용하는 동안 localStorage는 만료되지 않는다는 점을 지적하고 싶었습니다. 만료 될 항목을 찾고있는 경우 이로 인해 몇 가지 문제가 발생할 수 있습니다. localstorage에 만료 날짜를 추가 한 다음 날짜를 비교하여 여전히 적용 가능한지 확인하는 것이 유용 할 수 있습니다. 물론 만료가 필요한 경우 쿠키를 사용해야한다고 주장합니다. 하지만이 스크립트는 현재처럼 일관성이 없어야하기보다는 만료를 허용하거나 허용하지 않아야한다고 생각합니다.
Hanna

1
@MohsinSaeed는 개인 모드에서 브라우저가 쿠키 생성을 허용하지 않을 것이라고 생각합니다. superuser.com/questions/589248/…
Aamir Afridi 2015 년

19

Modernizr 위키에서 polyfill 페이지를 보셨습니까?

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

해당 페이지에서 webstorage 섹션을 찾으면 10 개의 잠재적 솔루션 (2011 년 7 월 현재)을 볼 수 있습니다.

행운을 빕니다! 표


1
해결 방법은 쿠키를 만드는 것이므로 해당 모드에서도 비활성화되는 개인 / 시크릿 모드 (예 : Safari 또는 Chrome)에서 작동하지 않는 것 같습니다.
Alex Klaus

14

아래는 모든 코드를 로컬 범위 내에 캡슐화 한 Aamir Afridi의 응답을 정리 한 버전입니다.

전역 ret변수 를 만드는 참조를 제거하고 저장된 "true"및 "false"문자열을 BrowserStorage.get()메서드 내에서 부울 값으로 구문 분석하는 것을 제거 했습니다. 실제로 "true"또는 "true"문자열을 저장하려고하면 문제가 발생할 수 있습니다. "그릇된".

로컬 저장소 API는 문자열 값만 지원하므로 해당 데이터를 JSON 문자열로 인코딩하여 적절한 데이터 유형과 함께 JavaScript 변수 데이터를 저장 / 검색 할 수 있으며, 그런 다음 https 와 같은 JSON 인코딩 / 디코딩 라이브러리를 사용하여 디코딩 할 수 있습니다 . //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);
        }
    };
})();

10

개인적으로 amplify.js를 선호 합니다 . 과거에는 정말 잘 작동했으며 모든 로컬 스토리지 요구 사항에 권장했습니다.

IE 5+, Firefox 2+, Safari 4+, Chrome, Opera 10.5+, iPhone 2+, Android 2+를 지원하고 브라우저 간 스토리지를 처리하기위한 일관된 API를 제공합니다.




1

Lawnchair 도 좋은 대안 인 것 같습니다.

잔디 의자는 작고 외부를 제외하고는 일종의 소파와 같습니다. 가볍고 적응력이 뛰어나며 간단하고 우아한 지속성 솔루션이 필요한 html5 모바일 앱에 적합합니다.

  • 컬렉션. 잔디 의자 인스턴스는 실제로 객체의 배열입니다.
  • 적응 형 지속성. 기본 저장소는 일관된 인터페이스 뒤에 추상화됩니다.
  • 플러그 형 컬렉션 동작. 때로는 수집 도우미가 필요하지만 항상 그런 것은 아닙니다.

0

Gears를 대체 수단으로 사용하는 realstorage 가 있습니다 .


감사. 불행히도 @ josh3736의 PersistJS 제안보다 더 적은 브라우저를 지원할 것 같습니다. 나는 여전히 그것을 살펴보고 제안에 감사하겠습니다.
Tauren 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.