134 votes

HTML5 localStorage erreur avec Safari : « QUOTA_EXCEEDED_ERR : DOM Exception 22 : une tentative a été faite pour ajouter quelque chose à qui ont dépassé le quota de stockage. »

Ma webapp ont des erreurs javascript dans ios safari navigation privée :

mon code :

186voto

KingKongFrog Points 3382

Apparemment, c'est par la conception. Quand Safari (OS X ou iOS) est en mode de navigation privée, il semble que localStorage est disponible, mais d'essayer d'appel setItem déclenche une exception.

store.js line 73
"QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota."

Ce qui se passe, c'est que l'objet de la fenêtre encore expose localStorage en l'espace de noms global, mais lorsque vous appelez setItem, cette exception est levée. Tous les appels à des removeItem sont ignorés.

Je crois que la solution la plus simple (bien que je n'ai pas testé cette croix navigateur encore) serait de modifier la fonction isLocalStorageNameSupported() de test que vous pouvez également définir une valeur.

https://github.com/marcuswestin/store.js/issues/42

function isLocalStorageNameSupported() 
{
    var testKey = 'test', storage = window.sessionStorage;
    try 
    {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return localStorageName in win && win[localStorageName];
    } 
    catch (error) 
    {
        return false;
    }
}

38voto

Yashua Points 3482

Le correctif publié le lien ci-dessus ne fonctionne pas pour moi. Cela fait :

Dérivé de http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5

11voto

Pierre Le Roux Points 45

Dans mon contexte, juste développé une classe d'abstraction. Quand mon application est lancée, je vérifie si localStorage est de travailler en appelant getStorage(). Cette fonction est aussi de retour :

  • soit localStorage si localStorage est de travail
  • ou d'une mise en œuvre d'une classe personnalisée LocalStorageAlternative

Dans mon code je n'ai jamais appel localStorage directement. J'appelle cusSto**global var, j'avais initialisé par appel **getStorage().

De cette façon, il fonctionne avec la navigation privée ou spécifiques Safari versions

function getStorage() {
var storageImpl;

 try { 
        localStorage.setItem("storage", ""); 
        localStorage.removeItem("storage");
        storageImpl = localStorage;
 }
 catch(err) { 
     storageImpl = new LocalStorageAlternative();
 }

return storageImpl;

}

function LocalStorageAlternative() {

var structureLocalStorage = {};

this.setItem = function (key, value) {
    structureLocalStorage[key] = value;
}

this.getItem = function (key) {
    if(typeof structureLocalStorage[key] != 'undefined' ) {
        return structureLocalStorage[key];
    }
    else {
        return null;
    }
}

this.removeItem = function (key) {
    structureLocalStorage[key] = undefined;
}
}


cusSto=getStorage();

3voto

jorgecasar Points 36

J’ai eu le même problème à l’aide de cadre ionique (angulaire + Cordova). Je sais que cela ne résout ne pas le problème, mais c’est le code pour les Apps angulaire basée sur les réponses ci-dessus. Vous aurez une solution éphémère pour localStorage sur iOS version de Safari.

https://GIST.github.com/jorgecasar/61fda6590dc2bb17e871

Profitez de vos codes !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X