Las siguientes alertas de código ls exist
en IE7:
if(window.localStorage) {
alert('ls exists');
} else {
alert('ls does not exist');
}
IE7 realmente no es compatible con el almacenamiento local, pero aún así lo alerta. Quizás esto se deba a que estoy usando IE9 en el navegador IE7 y en los modos de documento usando la herramienta de desarrollo IE9. O tal vez esta sea la forma incorrecta de probar si LS es compatible. ¿Cuál es la manera correcta?
Además, no quiero usar Modernizr ya que estoy usando solo algunas características HTML5 y no vale la pena cargar un script grande solo para detectar soporte para esas pocas cosas.
javascript
html
TK123
fuente
fuente
Respuestas:
No tiene que usar modernizr, pero puede usar su método para detectar si
localStorage
es compatiblemodernizr en prueba de github
para
localStorage
// In FF4, if disabled, window.localStorage should === null. // Normally, we could not test that directly and need to do a // `('localStorage' in window) && ` test first because otherwise Firefox will // throw bugzil.la/365772 if cookies are disabled // Also in iOS5 & Safari Private Browsing mode, attempting to use localStorage.setItem // will throw the exception: // QUOTA_EXCEEDED_ERRROR DOM Exception 22. // Peculiarly, getItem and removeItem calls do not throw. // Because we are forced to try/catch this, we'll go aggressive. // Just FWIW: IE8 Compat mode supports these features completely: // www.quirksmode.org/dom/html5.html // But IE8 doesn't support either with local files Modernizr.addTest('localstorage', function() { var mod = 'modernizr'; try { localStorage.setItem(mod, mod); localStorage.removeItem(mod); return true; } catch(e) { return false; } });
actualizado con el código fuente actual
fuente
var mod = "test";
antes del bloque try-catch, de lo contrario, esto siempre fallará ya que mod no está definido allí.if(typeof Storage !== "undefined") { // Yes! localStorage and sessionStorage support! // Some code..... } else { // Sorry! No web storage support.. }
fuente
typeof(Storage) !== void(0)
es una mejor soluciónif (Storage !== void(0))
typeof
no es una función, es un operador de lenguaje. ¿Por qué el paréntesis?Esta función funciona bien:
function supports_html5_storage(){ try { return 'localStorage' in window && window['localStorage'] !== null; } catch(e) { return false; } }
Fuente: www.diveintohtml5.info
fuente
'localStorage' in window
verifica que la propiedad existe en el objeto de la ventana (no es 'indefinida'), y la segundawindow['localStorage'] !== null
verifica que esa propiedad no sea NULL.Para reducir el tamaño del archivo de Modernizr, personalice el archivo en http://modernizr.com/download/ para que se ajuste a sus necesidades. Una versión localStorage de Modernizr tiene un costo de 1.55KB.
fuente
Prueba
window.localStorage!==undefined
:if(window.localStorage!==undefined){ //Do something }else{ alert('Your browser is outdated!'); }
También puede usar
typeof window.localStorage!=="undefined"
, pero la declaración anterior ya lo hacefuente
SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.
No lo vi en las respuestas, pero creo que es bueno saber que puedes usar Vanilla JS o jQuery fácilmente para pruebas tan simples, y aunque Modernizr ayuda mucho, hay soluciones limpias sin él.
Si usa jQuery , puede hacer:
var _supportsLocalStorage = !!window.localStorage && $.isFunction(localStorage.getItem) && $.isFunction(localStorage.setItem) && $.isFunction(localStorage.removeItem);
O, con JavaScript puro de vainilla :
var _supportsLocalStorage = !!window.localStorage && typeof localStorage.getItem === 'function' && typeof localStorage.setItem === 'function' && typeof localStorage.removeItem === 'function';
Luego, simplemente haría un SI para probar el soporte:
if (_supportsLocalStorage) { console.log('ls is supported'); alert('ls is supported'); }
Entonces, la idea general es que siempre que necesite funciones de JavaScript, primero debe probar el objeto principal y luego los métodos que usa su código.
fuente
Try catch hará el trabajo:
try{ localStorage.setItem("name",name.value); localStorage.setItem("post",post.value); } catch(e){ alert(e.message); }
fuente
Tratar:
if(typeof window.localStorage != 'undefined') { }
fuente
if (window.localStorage){ alert('localStorage is supported'); window.localStorage.setItem("whatever", "string value"); }
fuente
Modificar la respuesta de Andrea para agregar un getter hace que sea más fácil de usar. Con lo siguiente simplemente dices:
if(ls)...
var ls = { get: function () { var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch(e) { return false; } } };
var ls = { get: function () { var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch(e) { return false; } } }; function script(){ if(ls){ alert('Yes'); } else { alert('No'); } }
<button onclick="script()">Local Storage Support?</button>
fuente
Sé que llego un poco tarde a la fiesta, pero tengo algunas funciones útiles que preparé y agregué a un archivo llamado "manage_storage.js". Espero que les sean tan útiles a ustedes como me han servido bien.
Entonces, sin más preámbulos, aquí está mi código:
/* Conditional Function checks a web browser for 'session storage' support. [BEGIN] */ if (typeof isSessStorageAllowed !== 'function') { function isSessStorageAllowed() { if (!!window.sessionStorage && typeof sessionStorage.getItem === 'function' && typeof sessionStorage.setItem === 'function' && typeof sessionStorage.removeItem === 'function') { try { var cur_dt = new Date(); var cur_tm = cur_dt.getTime(); var ss_test_itm_key = 'ss_test_itm_' + String(cur_tm); var ss_test_val = 'ss_test_val_' + String(cur_tm); sessionStorage.setItem(ss_test_itm_key, String(ss_test_val)); if (sessionStorage.getItem(ss_test_itm_key) == String(ss_test_val)) { return true; } else { return false; }; sessionStorage.removeItem(ss_test_itm_key); } catch (exception) { return false; }; } else { return false; }; }; }; /* Conditional Function checks a web browser for 'session storage' support. [END] */ /* Conditional Function checks a web browser for 'local storage' support. [BEGIN] */ if (typeof isLclStorageAllowed !== 'function') { function isLclStorageAllowed() { if (!!window.localStorage && typeof localStorage.getItem === 'function' && typeof localStorage.setItem === 'function' && typeof localStorage.removeItem === 'function') { try { var cur_dt = new Date(); var cur_tm = cur_dt.getTime(); var ls_test_itm_key = 'ls_test_itm_' + String(cur_tm); var ls_test_val = 'ls_test_val_' + String(cur_tm); localStorage.setItem(ls_test_itm_key, String(ls_test_val)); if (localStorage.getItem(ls_test_itm_key) == String(ls_test_val)) { return true; } else { return false; }; localStorage.removeItem(ls_test_itm_key); } catch (exception) { return false; }; } else { return false; }; }; }; /* Conditional Function checks a web browser for 'local storage' support. [END] */ /* Conditional Function checks a web browser for 'web storage' support. [BEGIN] */ /* Prerequisites: 'isSessStorageAllowed()', 'isLclStorageAllowed()' */ if (typeof isWebStorageAllowed !== 'function') { function isWebStorageAllowed() { if (isSessStorageAllowed() === true && isLclStorageAllowed() === true) { return true; } else { return false; }; }; }; /* Conditional Function checks a web browser for 'web storage' support. [END] */
fuente