L'utilisation de LocalStorage sur iPhone avec iOS 7 génère cette erreur. J'ai cherché un résolvant, mais étant donné que je ne navigue même pas en privé, rien n'est pertinent.
Je ne comprends pas pourquoi localStorage serait désactivé par défaut dans iOS 7, mais il semble que ce soit le cas? J'ai également testé sur d'autres sites, mais sans succès. J'ai même essayé de le tester en utilisant ce site Web: http://arty.name/localstorage.html , mais il ne semble pas que cela enregistre quoi que ce soit pour une raison étrange.
Quelqu'un a-t-il eu le même problème, seulement ils ont eu de la chance de le résoudre? Dois-je changer de méthode de stockage?
J'ai essayé de le déboguer en ne stockant que quelques lignes d'informations, mais en vain. J'ai utilisé la localStorage.setItem()
fonction standard pour enregistrer.
Réponses:
Cela peut se produire lorsque Safari est en navigation en mode privé. En navigation privée, le stockage local n'est pas disponible du tout.
Une solution consiste à avertir l'utilisateur que l'application a besoin d'un mode non privé pour fonctionner.
MISE À JOUR: Cela a été corrigé dans Safari 11 , donc le comportement est maintenant aligné avec les autres navigateurs.
la source
if( typeof Storage != 'undefined' ) { ... }
) avant d'essayer de charger et d'enregistrer des informations mais d'obtenir cette erreur. S'avèreStorage
est toujours défini même lorsqu'il est inutilisable. Utilisation de try / catch à partir de maintenant chaque fois que j'utilise LocalStorage.Comme mentionné dans d'autres réponses, vous obtiendrez toujours QuotaExceededError en mode navigateur privé Safari sur iOS et OS X lorsque
localStorage.setItem
(ousessionStorage.setItem
) est appelé.Une solution consiste à faire une vérification try / catch ou Modernizr dans chaque instance d'utilisation
setItem
.Cependant, si vous voulez un shim qui arrête simplement globalement cette erreur, pour empêcher le reste de votre JavaScript de se casser, vous pouvez utiliser ceci:
https://gist.github.com/philfreo/68ea3cd980d72383c951
la source
J'utilise cette fonction simple, qui renvoie
true
oufalse
, pour tester la disponibilité de localStorage:Vous pouvez maintenant tester la
localStorage.setItem()
disponibilité avant de l'utiliser. Exemple:la source
window.sessionStorage
utilisé à la place d'window.localStorage
une méthode appeléeisLocalStorageNameSupported
?HTML local storage provides two objects for storing data on the client: window.localStorage - stores data with no expiration date window.sessionStorage - stores data for one session (data is lost when the browser tab is closed)
sessionStorage
rend plus facile à gérer pour définir des points d'arrêt si vous souhaitez tester votre développement. Il n'y a pas de véritable argument pour lequel "mieux" et c'est vraiment juste une préférence personnelle ici qui pèche par excès de prudence. La principale chose à noter est que les deuxsessionStorage
etlocalStorage
sont les deux implémentations de l'API HTML5 webstorage.Il m'est arrivé de courir avec le même problème dans iOS 7 (avec certains appareils sans simulateurs).
Il semble que Safari dans iOS 7 ait un quota de stockage inférieur, qui est apparemment atteint grâce à un long historique.
J'imagine que la meilleure pratique sera d'attraper l'exception.
Le projet Modernizr a un correctif facile, vous devriez essayer quelque chose de similaire: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
la source
Voici une solution étendue basée sur la réponse de DrewT ci-dessus qui utilise des cookies si localStorage n'est pas disponible. Il utilise la bibliothèque docCookies de Mozilla :
Dans votre source, utilisez simplement:
la source
Comme déjà expliqué dans d'autres réponses, en mode de navigation privée, Safari lève toujours cette exception lorsque vous essayez d'enregistrer des données avec
localStorage.setItem()
.Pour résoudre ce problème, j'ai écrit un faux localStorage qui imite localStorage, à la fois les méthodes et les événements.
Fake localStorage: https://gist.github.com/engelfrost/fd707819658f72b42f55
Ce n'est probablement pas une bonne solution générale au problème. C'était une bonne solution pour mon scénario, où l'alternative serait une réécriture majeure sur une application déjà existante.
la source
Mise à jour (2016-11-01)
J'utilisais AmplifyJS mentionné ci-dessous pour contourner ce problème. Cependant, pour Safari en navigation privée, il retombait sur un stockage basé sur la mémoire. Dans mon cas, cela n'était pas approprié car cela signifie que le stockage est effacé lors de l'actualisation, même si l'utilisateur est toujours en navigation privée.
De plus, j'ai remarqué un certain nombre d'utilisateurs qui naviguent toujours en mode privé sur iOS Safari. Pour cette raison, une meilleure solution de rechange pour Safari consiste à utiliser des cookies (si disponibles). Par défaut, les cookies sont toujours accessibles même en navigation privée. Bien sûr, ils sont effacés lorsque vous quittez la navigation privée, mais ils ne sont pas effacés lors de l'actualisation.
J'ai trouvé la bibliothèque local-storage-fallback . De la documentation:
Méfiez-vous des gotchas:
TL; DR:
Utilisez local-storage-fallback (API unifiée avec
.getItem(prop)
et.setItem(prop, val)
):Réponse originale
Pour ajouter aux réponses précédentes, une solution de contournement possible serait de changer la méthode de stockage. Il existe quelques bibliothèques telles que AmplifyJS et PersistJS qui peuvent vous aider. Les deux bibliothèques permettent un stockage persistant côté client via plusieurs backends.
Pour AmplifyJS
Pour PersistentJS
Ils offrent une couche d'abstraction afin que vous n'ayez pas à vous soucier du choix du type de stockage. Gardez à l'esprit qu'il peut y avoir des limitations (telles que des limites de taille) en fonction du type de stockage. En ce moment, j'utilise AmplifyJS, mais je dois encore faire des tests supplémentaires sur iOS 7 / Safari / etc. pour voir si cela résout réellement le problème.
la source
En avril 2017, un correctif a été fusionné dans Safari, il s'est donc aligné sur les autres navigateurs. Cela a été publié avec Safari 11.
https://bugs.webkit.org/show_bug.cgi?id=157010
la source
Cette question et cette réponse m'ont aidé à résoudre un problème spécifique lié à l'inscription de nouveaux utilisateurs dans Parse.
Étant donné que la fonction signUp (attrs, options) utilise le stockage local pour conserver la session, si un utilisateur est en mode de navigation privée, il renvoie «QuotaExceededError: DOM Exception 22: une tentative a été effectuée pour ajouter quelque chose au stockage qui dépasse le quota». exception et les fonctions succès / erreur ne sont jamais appelées.
Dans mon cas, parce que la fonction d'erreur n'est jamais appelée, elle semblait initialement être un problème avec le déclenchement de l'événement de clic sur la soumission ou la redirection définie en cas de succès de l'inscription.
L'inclusion d'un avertissement pour les utilisateurs a résolu le problème.
Parse Javascript SDK Reference https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
la source