Mon application Web a des erreurs javascript dans la navigation privée iOS Safari:
JavaScript: erreur
indéfini
QUOTA_EXCEEDED_ERR: Exception DOM 22: Une tentative a été faite pour ajouter quelque chose au stockage ...
mon code:
localStorage.setItem('test',1)
javascript
html
local-storage
Leiyonglin
la source
la source
Réponses:
Apparemment, c'est par conception. Lorsque Safari (OS X ou iOS) est en mode de navigation privée, il semble qu'il
localStorage
soit disponible, mais essayer d'appelersetItem
lève une exception.Ce qui se passe, c'est que l'objet window est toujours exposé
localStorage
dans l'espace de noms global, mais lorsque vous appelezsetItem
, cette exception est levée. Tous les appels àremoveItem
sont ignorés.Je pense que la solution la plus simple (bien que je n'ai pas encore testé ce navigateur croisé) serait de modifier la fonction
isLocalStorageNameSupported()
pour tester que vous pouvez également définir une valeur.https://github.com/marcuswestin/store.js/issues/42
la source
return localStorageName in win && win[localStorageName];
àreturn true
. Ensuite, vous avez une fonction qui renvoie en toute sécurité true ou false en fonction de la disponibilité de localStorage. Par exemple:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
Le correctif publié sur le lien ci-dessus n'a pas fonctionné pour moi. Cela a fait:
Dérivé de http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
la source
window.sessionStorage
c'est correct. Cela fonctionne certainement dans mon code. Veuillez indiquer le correctif du problème que vous semblez connaître.isLocalStorageNameSupported
et que je vérifiaiswindow.sessionStorage
. Même résultat final mais un peu déroutant. La réponse a été modifiée pour clarifier.Comme mentionné dans d'autres réponses, vous obtiendrez toujours l'erreur QuotaExceededError en mode navigateur privé Safari sur iOS et OS X lorsque
localStorage.setItem
(ousessionStorage.setItem
) est appelé.Une solution consiste à effectuer 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
Dans mon contexte, je viens de développer une abstraction de classe. Lorsque mon application est lancée, je vérifie si localStorage fonctionne en appelant getStorage () . Cette fonction renvoie également:
Dans mon code, je n'appelle jamais localStorage directement. J'appelle cusSto global var, j'avais initialisé en appelant getStorage () .
De cette façon, cela fonctionne avec la navigation privée ou des versions spécifiques de Safari
la source
Il semble que Safari 11 change le comportement, et maintenant le stockage local fonctionne dans une fenêtre de navigateur privé. Hourra!
Notre application Web qui échouait dans la navigation privée Safari fonctionne désormais parfaitement. Cela a toujours bien fonctionné dans le mode de navigation privée de Chrome, qui a toujours permis d'écrire sur le stockage local.
Ceci est documenté dans les notes de mise à jour de Safari Technology Preview d' Apple - et dans les notes de mise à jour de WebKit - pour la version 29, qui date de mai 2017.
Plus précisément:
la source
Pour développer les réponses des autres, voici une solution compacte qui n'expose / n'ajoute aucune nouvelle variable. Il ne couvre pas toutes les bases, mais il devrait convenir à la plupart des personnes qui souhaitent qu'une seule application de page reste fonctionnelle (malgré l'absence de persistance des données après le rechargement).
la source
J'ai eu le même problème en utilisant le framework Ionic (Angular + Cordova). Je sais que cela ne résout pas le problème, mais c'est le code pour Angular Apps basé sur les réponses ci-dessus. Vous disposerez d'une solution éphémère pour localStorage sur la version iOS de Safari.
Voici le code:
Source: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
Profitez de votre codage!
la source
Voici une solution pour AngularJS utilisant un IIFE et tirant parti du fait que les services sont des singletons .
Cela entraîne
isLocalStorageAvailable
une définition immédiate lorsque le service est injecté pour la première fois et évite d'exécuter inutilement la vérification à chaque fois que le stockage local doit être accédé.la source
Je viens de créer cette prise en pension pour fournir
sessionStorage
etlocalStorage
fonctionnalités pour les navigateurs non pris en charge ou à mobilité réduite.Navigateurs pris en charge
Comment ça fonctionne
Il détecte la fonction avec le type de stockage.
Ensembles
StorageService.localStorage
dewindow.localStorage
si elle est prise en charge ou crée un stockage de cookies. EnsemblesStorageService.sessionStorage
dewindow.sessionStorage
si elle est prise en charge ou crée un stockage dans la mémoire pour SPA, le stockage des cookies avec des fonctionnalités de sesion pour non SPA.la source
Voici une version de service Angular2 + pour une alternative de stockage mémoire, vous pouvez simplement l'injecter dans vos composants, sur la base de la réponse de Pierre Le Roux.
la source
Ne l'utilisez pas s'il n'est pas pris en charge et pour vérifier le support, appelez simplement cette fonction
la source
J'ai créé un correctif pour le problème. Je vérifie simplement si le navigateur prend en charge localStorage ou sessionStorage ou non. Sinon, le moteur de stockage sera Cookie. Mais le côté négatif est que Cookie a une très petite mémoire de stockage :(
la source
La réponse acceptée ne semble pas adéquate dans plusieurs situations.
Pour vérifier si le
localStorage
ousessionStorage
sont pris en charge, j'utilise l'extrait suivant de MDN .Utilisez cet extrait de code comme celui-ci et utilisez un cookie, par exemple:
J'ai créé le package fallbackstorage qui utilise cet extrait de code pour vérifier la disponibilité du stockage et le repli vers un MemoryStorage implémenté manuellement.
la source
la source
Le script suivant a résolu mon problème:
Il vérifie si localStorage existe et peut être utilisé et dans le cas négatif, il crée un faux stockage local et l'utilise à la place du localStorage d'origine. Veuillez me faire savoir si vous avez besoin de plus amples informations.
la source