2011-11-27 11 views
1

Web Storage API가 지원되고 사용 가능하다는 것을 확인해야합니다 (보안 문제로 인해 비활성화되었을 수 있음). '그 종류가 존재 할 수 있었다 그러나Web Storage가 지원되는지 여부를 확인하십시오.

if (typeof sessionStorage != 'undefined') 
{ 
    alert('sessionStorage available'); 
} 
else 
{ 
    alert('sessionStorage not available'); 
} 

, 나는 궁금했지만, 나는 같으면 :

그래서, 나는 그것이 유형의 sessionStorage 또는 로컬 스토리지가 정의 여부를 확인하기 위해 충분 생각 어쨌든 Web Storage API를 사용할 수있었습니다.

비고 : 쿠키가 비활성화되어 있고 sessionStorage 또는 localStorage에 액세스하면 Firefox에서 보안 오류가 발생합니다.

답변

0

그래서, Modernizr.localstorage 때문에 각각 Modernizr.sessionstorage이 (true를 반환 할 보안 오류로 이어질 것입니다.) 또는 다른 독점적 인 (예기치 않은) 동작이 발생할 수 있습니다. 자신의 webStorageEnabled 함수를 작성하여 잘 작동하는 것으로 보입니다.

function cookiesEnabled() 
{ 
    // generate a cookie to probe cookie access 
    document.cookie = '__cookieprobe=0;path=/'; 
    return document.cookie.indexOf('__cookieprobe') != -1; 
} 

function webStorageEnabled() 
{ 
    if (typeof webStorageEnabled.value == 'undefined') 
    { 
     try 
     { 
      localStorage.setItem('__webstorageprobe', ''); 
      localStorage.removeItem('__webstorageprobe'); 
      webStorageEnabled.value = true; 
     } 
     catch (e) { 
      webStorageEnabled.value = false; 
     } 
    } 

    return webStorageEnabled.value; 
} 


// conditional 

var storage = new function() 
{ 
    if (webStorageEnabled()) 
    { 
     return { 
      local: localStorage, 
      session: sessionStorage 
     }; 
    } 
    else 
    { 
     return { 
      local: cookiesEnabled() ? function() 
      { 
       // use cookies here 
      }() : null, 

      session: function() 
      { 
       var data = {}; 

       return { 
        clear: function() { 
         data = {}; 
        }, 

        getItem: function(key) { 
         return data[key] || null; 
        }, 

        key: function(i) 
        { 
         var index = 0; 
         for (var value in data) 
         { 
          if (index == i) 
           return value; 
          ++index; 
         } 
        }, 

        removeItem: function(key) { 
         delete data[key]; 
        }, 

        setItem: function(key, value) { 
         data[key] = value + ''; 
        } 
       }; 
      }() 
     }; 
    } 
} 

희망은 누군가에게도 유용 할 것입니다.

4

로컬 스토리지가 지원되는지 여부를 확인하기 위해 Modernizr 라이브러리를 사용하지 않는 이유는 무엇입니까? 브라우저의 경우 간의 차이 당신은 그냥이 같은 코드를 사용할 수 있습니다, 당신을 위해 처리를 수행 할 : 파이어 폭스하지 않거나 쿠키와 함께 사용할 수있는 반면

if (Modernizr.localstorage) { 
    // browser supports local storage 
} else { 
    // browser doesn't support local storage 
} 
+0

흠 , 그것은 Firefox 및 비활성화 된 쿠키에서 작동하지 않습니다. 나는 그것을 테스트했지만 여전히 보안 오류가 발생했습니다. – 0xbadf00d

+0

@SaschaHoll - 어떤 오류가 발생하고 있습니까? 어떤 버전의 Firefox입니까? 그것은 Firefox 8.0에서 저에게 잘 돌아갑니다. –

+0

같은 버전이 여기에 있습니다. 쿠키를 비활성화해야합니다. 당신이 할 경우 그것은 작동하지 않습니다 (내 최신 답변 참조). – 0xbadf00d

1
try{ 
    ssSupport = Object.prototype.toString.call(sessionStorage) === "[object Storage]"; 
} 
catch(e){ 
    ssSupport = false; 
} 
3

나는 당신이 원래 코드로 올바른 길을 가고 있다고 생각하는데, 이것을 너무 화려하게 만들 필요가 없다. 코드에서 추가 종속성을 가진 KISS principle를 사용

:

var storageEnabled = function() { 
    try { 
     sessionStorage.setItem('test-key','test-value'); 
     if (sessionStorage.getItem('test-key') == 'test-value'){ 
      return true; 
     } 
    } catch (e) {}; 
    return false; 
}; 

alert(storageEnabled() ? 'sessionStorage available' : 'sessionStorage not available'); 
0

내 버전 (IE 9가 인트라넷 사이트에 IE 8 이상에서 실행하기 때문에이 고장)을. 저장 개체 수 있도록 setObject를 추가

if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) { 

} 

더 긴 버전 : 여기

var sstorage; 

if (typeof (Storage) != "undefined" && !!sessionStorage.getItem) { 
    Storage.prototype.setObject = function (key, value) { 
     this.setItem(key, JSON.stringify(value)); 
    }; 

    Storage.prototype.getObject = function (key) { 
     return JSON.parse(this.getItem(key)); 
    }; 
    if (typeof sessionStorage.setObject == "function") { 
     sstorage = sessionStorage; 
    } 
    else { 
     setupOldBrowser(); 
    } 
} 
else { 
    setupOldBrowser(); 
} 


function setupOldBrowser() { 
    sstorage = {}; 
    sstorage.setObject = function (key, value) { 
     this[key] = JSON.stringify(value); 
    }; 
    sstorage.getObject = function (key) { 
     if (typeof this[key] == 'string') { 
      return JSON.parse(this[key]); 
     } 
     else { 
      return null; 
     } 
    }; 

    sstorage.removeItem = function (key) { 
     delete this[key]; 
    }; 
} 
0

은 .. 나는 그것이 아니라면, 가능한 경우 세션 저장소를 사용하려면 어떻게 쿠키를 사용하여 무엇

var setCookie; 
var getCookie; 

var sessionStorageSupported = 'sessionStorage' in window 
            && window['sessionStorage'] !== null; 

if (sessionStorageSupported) { 
    setCookie = function (cookieName, value) { 
     window.sessionStorage.setItem(cookieName, value); 
     return value; //you can introduce try-catch here if required 
    }; 
    getCookie = function (cookieName) { 
     return window.sessionStorage.getItem(cookieName); 
    }; 
} 
else { 
    setCookie = function (cookieName, value) { 
     $.cookie(cookieName, value); 
     return value; // null if key not present 
    }; 
    getCookie = function(cookieName) { 
     console.log("using cookies"); 
     return $.cookie(cookieName); 
    }; 
} 
관련 문제