Meine Webanwendung hat Javascript-Fehler beim privaten Surfen in ios safari:
JavaScript: Fehler
nicht definiert
QUOTA_EXCEEDED_ERR: DOM-Ausnahme 22: Es wurde versucht, dem Speicher etwas hinzuzufügen ...
Mein Code:
localStorage.setItem('test',1)
javascript
html
local-storage
Leiyonglin
quelle
quelle
Antworten:
Anscheinend ist dies beabsichtigt. Wenn sich Safari (OS X oder iOS) im privaten Browsermodus befindet, scheint
localStorage
es verfügbar zu sein, aber der Versuch, einen Anruf zu tätigen,setItem
löst eine Ausnahme aus.Was passiert ist, dass das Fensterobjekt immer noch
localStorage
im globalen Namespace verfügbar gemacht wird, aber wenn Sie aufrufensetItem
, wird diese Ausnahme ausgelöst. Alle Anrufe anremoveItem
werden ignoriert.Ich glaube, die einfachste Lösung (obwohl ich diesen Cross-Browser noch nicht getestet habe) wäre, die Funktion
isLocalStorageNameSupported()
zu ändern, um zu testen, ob Sie auch einen Wert festlegen können.https://github.com/marcuswestin/store.js/issues/42
quelle
return localStorageName in win && win[localStorageName];
zureturn true
. Dann haben Sie eine Funktion, die je nach Verfügbarkeit von localStorage sicher true oder false zurückgibt. Zum Beispiel:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
Das auf dem obigen Link veröffentlichte Update hat bei mir nicht funktioniert. Dies tat:
Abgeleitet von http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
quelle
window.sessionStorage
ist richtig. Es funktioniert sicherlich in meinem Code. Bitte weisen Sie tatsächlich auf die Lösung des Problems hin, über das Sie anscheinend Bescheid wissen.isLocalStorageNameSupported
und überprüft habewindow.sessionStorage
. Gleiches Endergebnis, aber etwas verwirrend. Die Antwort wurde zur Verdeutlichung bearbeitet.Wie in anderen Antworten erwähnt, erhalten Sie den QuotaExceededError immer im privaten Safari-Browsermodus unter iOS und OS X, wenn
localStorage.setItem
(odersessionStorage.setItem
) aufgerufen wird.Eine Lösung besteht darin , in jedem Verwendungsfall einen Try / Catch- oder Modernizr-Check durchzuführen
setItem
.Wenn Sie jedoch einen Shim möchten, der diesen Fehler einfach global verhindert, um zu verhindern, dass der Rest Ihres JavaScript beschädigt wird, können Sie Folgendes verwenden:
https://gist.github.com/philfreo/68ea3cd980d72383c951
quelle
In meinem Kontext habe ich gerade eine Klassenabstraktion entwickelt. Wenn meine Anwendung gestartet wird, überprüfe ich, ob localStorage funktioniert, indem ich getStorage () aufrufe . Diese Funktion gibt auch zurück:
In meinem Code rufe ich localStorage nie direkt auf. Ich rufe cusSto global var auf, das ich durch Aufrufen von getStorage () initialisiert hatte .
Auf diese Weise funktioniert es mit privatem Surfen oder bestimmten Safari-Versionen
quelle
Es scheint, dass Safari 11 das Verhalten ändert und der lokale Speicher jetzt in einem privaten Browserfenster funktioniert. Hurra!
Unsere Web-App, die früher beim privaten Surfen in Safari fehlgeschlagen ist, funktioniert jetzt einwandfrei. Im privaten Browsermodus von Chrome hat es immer gut funktioniert, da immer in den lokalen Speicher geschrieben werden konnte.
Dies ist in den Versionshinweisen zu Safari Technology Preview von Apple - und den Versionshinweisen zu WebKit - für Version 29 dokumentiert , die im Mai 2017 veröffentlicht wurde.
Speziell:
quelle
Um die Antworten anderer zu erweitern, finden Sie hier eine kompakte Lösung, die keine neuen Variablen verfügbar macht / hinzufügt. Es deckt nicht alle Basen ab, sollte jedoch für die meisten Benutzer geeignet sein, die nur möchten, dass eine App mit nur einer Seite funktionsfähig bleibt (obwohl nach dem erneuten Laden keine Datenbeständigkeit besteht).
quelle
Ich hatte das gleiche Problem mit dem Ionic Framework (Angular + Cordova). Ich weiß, dass dies das Problem nicht löst, aber es ist der Code für Angular Apps, der auf den obigen Antworten basiert. Sie haben eine kurzlebige Lösung für localStorage für die iOS-Version von Safari.
Hier ist der Code:
Quelle: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
Viel Spaß beim Codieren!
quelle
Hier ist eine Lösung für AngularJS, die ein IIFE verwendet und die Tatsache nutzt, dass Dienste Singletons sind .
Dies führt dazu,
isLocalStorageAvailable
dass die Einstellung sofort beim ersten Injizieren des Dienstes erfolgt und die Prüfung nicht unnötig ausgeführt wird, wenn auf den lokalen Speicher zugegriffen werden muss.quelle
Ich habe gerade diese Repo zur Verfügung zu stellen
sessionStorage
undlocalStorage
biete für nicht unterstützten oder fähigen Browser.Unterstützte Browser
Wie es funktioniert
Es erkennt die Funktion mit dem Speichertyp.
Legt fest
StorageService.localStorage
,window.localStorage
ob es unterstützt wird oder ob ein Cookie-Speicher erstellt wird. Legt festStorageService.sessionStorage
,window.sessionStorage
ob es unterstützt wird oder einen In-Memory-Speicher für SPA erstellt, einen Cookie-Speicher mit Sitzungsfunktionen für Nicht-SPA.quelle
Hier ist eine Angular2 + -Dienstversion für die Speicheralternative, die Sie basierend auf der Antwort von Pierre Le Roux einfach in Ihre Komponenten einfügen können.
quelle
Verwenden Sie es nicht, wenn es nicht unterstützt wird. Um die Unterstützung zu überprüfen, rufen Sie einfach diese Funktion auf
quelle
Ich habe einen Patch für das Problem erstellt. Ich überprüfe einfach, ob der Browser localStorage oder sessionStorage unterstützt oder nicht. Wenn nicht, ist die Speicher-Engine Cookie. Aber die negative Seite ist, dass Cookies einen sehr kleinen Speicher haben :(
quelle
Die akzeptierte Antwort scheint in mehreren Situationen nicht angemessen zu sein.
Um zu überprüfen, ob die
localStorage
odersessionStorage
unterstützt werden, verwende ich das folgende Snippet von MDN .Verwenden Sie dieses Snippet wie folgt und greifen Sie beispielsweise auf Cookies zurück:
Ich habe das Fallbackstorage- Paket erstellt, das dieses Snippet verwendet, um die Speicherverfügbarkeit zu überprüfen und auf einen manuell implementierten MemoryStorage zurückzugreifen.
quelle
quelle
Das folgende Skript hat mein Problem gelöst:
Es prüft, ob localStorage vorhanden ist und verwendet werden kann, und im negativen Fall erstellt es einen gefälschten lokalen Speicher und verwendet ihn anstelle des ursprünglichen localStorage. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
quelle