Mi aplicación web tiene errores de JavaScript en la navegación privada de ios safari:
JavaScript: error
indefinido
QUOTA_EXCEEDED_ERR: DOM Excepción 22: se intentó agregar algo al almacenamiento ...
mi código:
localStorage.setItem('test',1)
javascript
html
local-storage
leiyonglin
fuente
fuente
Respuestas:
Aparentemente esto es por diseño. Cuando Safari (OS X o iOS) está en modo de navegación privada, parece que
localStorage
está disponible, pero intentar llamarsetItem
arroja una excepción.Lo que sucede es que el objeto de la ventana aún se expone
localStorage
en el espacio de nombres global, pero cuando llamasetItem
, se produce esta excepción. Cualquier llamada aremoveItem
se ignora.Creo que la solución más simple (aunque todavía no he probado este navegador cruzado) sería alterar la función
isLocalStorageNameSupported()
para probar que también puede establecer algún valor.https://github.com/marcuswestin/store.js/issues/42
fuente
return localStorageName in win && win[localStorageName];
areturn true
. Entonces tiene una función que devuelve con seguridad verdadero o falso dependiendo de la disponibilidad localStorage. Por ejemplo:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
La solución publicada en el enlace anterior no funcionó para mí. Esto hizo:
Derivado de http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
fuente
window.sessionStorage
es correcto. Ciertamente funciona en mi código. En realidad, señale la solución al problema que parece conocer.isLocalStorageNameSupported
y estaba comprobandowindow.sessionStorage
. El mismo resultado final pero fue un poco confuso. La respuesta fue editada para aclarar.Como se menciona en otras respuestas, siempre obtendrá QuotaExceededError en el modo de navegador privado Safari tanto en iOS como en OS X cuando
localStorage.setItem
(osessionStorage.setItem
se llama ).Una solución es hacer una prueba try / catch o Modernizr en cada instancia de uso
setItem
.Sin embargo, si desea una cuña que simplemente detenga globalmente este error, para evitar que el resto de su JavaScript se rompa, puede usar esto:
https://gist.github.com/philfreo/68ea3cd980d72383c951
fuente
En mi contexto, acabo de desarrollar una abstracción de clase. Cuando se inicia mi aplicación, compruebo si localStorage funciona llamando a getStorage () . Esta función también devuelve:
En mi código, nunca llamo a localStorage directamente. Llamo a cusSto global var, lo había inicializado llamando a getStorage () .
De esta manera, funciona con navegación privada o versiones específicas de Safari
fuente
Parece que Safari 11 cambia el comportamiento, y ahora el almacenamiento local funciona en una ventana privada del navegador. ¡Hurra!
Nuestra aplicación web que solía fallar en la navegación privada de Safari ahora funciona perfectamente. Siempre funcionó bien en el modo de navegación privada de Chrome, que siempre ha permitido escribir en el almacenamiento local.
Esto está documentado en las notas de lanzamiento de Safari Technology Preview de Apple, y en las notas de lanzamiento de WebKit , para el lanzamiento 29, que fue en mayo de 2017.
Específicamente:
fuente
Para ampliar las respuestas de otros, aquí hay una solución compacta que no expone / agrega ninguna variable nueva. No cubre todas las bases, pero debería adaptarse a la mayoría de las personas que solo desean que una aplicación de una sola página permanezca funcional (a pesar de que no persiste la información después de la recarga).
fuente
Tuve el mismo problema usando Ionic Framework (Angular + Cordova). Sé que esto no resuelve el problema, pero es el código para Angular Apps basado en las respuestas anteriores. Tendrá una solución efímera para localStorage en la versión iOS de Safari.
Aquí está el código:
Fuente: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
¡Disfruta tu codificación!
fuente
Aquí hay una solución para AngularJS utilizando un IIFE y aprovechando el hecho de que los servicios son únicos .
Esto
isLocalStorageAvailable
se configura inmediatamente cuando se inyecta el servicio por primera vez y evita ejecutar innecesariamente la verificación cada vez que se necesita acceder al almacenamiento local.fuente
He creado esta cesión temporal para proveer
sessionStorage
ylocalStorage
características de los navegadores no compatibles o discapacitados.Navegadores compatibles
Cómo funciona
Detecta la función con el tipo de almacenamiento.
Conjuntos
StorageService.localStorage
awindow.localStorage
si es compatible o crea un almacenamiento de cookies. ConjuntosStorageService.sessionStorage
awindow.sessionStorage
si es compatible o crea un almacenamiento en memoria para SPA, el almacenamiento de cookies con características sesion para no SPA.fuente
Aquí hay una versión de servicio Angular2 + para la alternativa de almacenamiento de memoria, puede simplemente inyectar en sus componentes, según la respuesta de Pierre Le Roux.
fuente
No lo use si no es compatible y para verificar el soporte solo llame a esta función
fuente
He creado un parche para el problema. Simplemente estoy comprobando si el navegador admite localStorage o sessionStorage o no. De lo contrario, el motor de almacenamiento será Cookie. Pero el lado negativo es que las cookies tienen una memoria de almacenamiento muy pequeña :(
fuente
La respuesta aceptada parece no adecuada en varias situaciones.
Para verificar si el
localStorage
osessionStorage
son compatibles, utilizo el siguiente fragmento de MDN .Utilice este fragmento como este y recurra a, por ejemplo, el uso de cookies:
He creado el paquete fallbackstorage que utiliza este fragmento para verificar la disponibilidad de almacenamiento y el respaldo a un MemoryStorage implementado manualmente.
fuente
fuente
El siguiente script resolvió mi problema:
Comprueba si localStorage existe y puede usarse y, en el caso negativo, crea un almacenamiento local falso y lo usa en lugar del localStorage original. Avíseme si necesita más información.
fuente