Die Verwendung von LocalStorage auf dem iPhone mit iOS 7 löst diesen Fehler aus. Ich habe mich nach einem Resolvant umgesehen, aber da ich nicht einmal privat surfe, ist nichts relevant.
Ich verstehe nicht, warum localStorage in iOS 7 standardmäßig deaktiviert ist, aber es scheint so? Ich habe auch auf anderen Websites getestet, aber ohne Glück. Ich habe sogar versucht, es über diese Website zu testen: http://arty.name/localstorage.html , aber es scheint aus irgendeinem seltsamen Grund überhaupt nichts zu speichern.
Hat jemand das gleiche Problem gehabt, nur hat er Glück gehabt, es zu beheben? Soll ich meine Speichermethode wechseln?
Ich habe versucht, es zu debuggen, indem ich nur ein paar Zeilen mit Informationen gespeichert habe, aber ohne Erfolg. Ich habe die Standardfunktion localStorage.setItem()
zum Speichern verwendet.
Antworten:
Dies kann auftreten, wenn sich Safari im privaten Modus befindet. Beim privaten Surfen ist lokaler Speicher überhaupt nicht verfügbar.
Eine Lösung besteht darin, den Benutzer zu warnen, dass die App einen nicht privaten Modus benötigt, um zu funktionieren.
UPDATE: Dies wurde in Safari 11 behoben , sodass das Verhalten jetzt mit anderen Browsern übereinstimmt.
quelle
if( typeof Storage != 'undefined' ) { ... }
vor dem Laden und Speichern von Informationen nach LocalStorage ( ) gesucht , aber diesen Fehler erhalten. Es stellt sich heraus, dassStorage
es auch dann noch definiert ist, wenn es unbrauchbar ist. Verwenden Sie von nun an try / catch, wenn ich LocalStorage verwende.Wie in anderen Antworten erwähnt, erhalten Sie den QuotaExceededError im privaten Safari-Browsermodus unter iOS und OS X immer, 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
Ich verwende diese einfache Funktion, die zurückgibt
true
oderfalse
, um die Verfügbarkeit von localStorage zu testen:Jetzt können Sie die
localStorage.setItem()
Verfügbarkeit testen, bevor Sie sie verwenden. Beispiel:quelle
window.sessionStorage
wurde anstellewindow.localStorage
einer Methode aufgerufenisLocalStorageNameSupported
?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
es einfacher macht, Haltepunkte zu setzen, wenn Sie Ihre Entwicklung testen möchten. Es gibt kein wahres Argument, für das "besser" ist, und es ist hier wirklich nur eine persönliche Präferenz, die auf der Seite der Vorsicht irrt. Die Hauptsache ist, dass beidesessionStorage
undlocalStorage
beide Implementierungen der HTML5-Webstorage-API sind.Ich habe zufällig das gleiche Problem in iOS 7 ausgeführt (bei einigen Geräten keine Simulatoren).
Es sieht so aus, als hätte Safari in iOS 7 ein niedrigeres Speicherkontingent, das anscheinend durch ein langes Verlaufsprotokoll erreicht wird.
Ich denke, die beste Vorgehensweise wird darin bestehen, die Ausnahme zu erwischen.
Das Modernizr-Projekt hat einen einfachen Patch. Sie sollten etwas Ähnliches ausprobieren: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
quelle
Hier ist eine erweiterte Lösung, die auf der obigen Antwort von DrewT basiert und Cookies verwendet, wenn localStorage nicht verfügbar ist. Es verwendet Mozillas docCookies-Bibliothek :
Verwenden Sie in Ihrer Quelle einfach:
quelle
Wie bereits in anderen Antworten erläutert, löst Safari im privaten Browsermodus diese Ausnahme immer aus , wenn versucht wird, Daten mit zu speichern
localStorage.setItem()
.Um dies zu beheben, habe ich einen gefälschten localStorage geschrieben, der localStorage nachahmt, sowohl Methoden als auch Ereignisse.
Gefälschter localStorage: https://gist.github.com/engelfrost/fd707819658f72b42f55
Dies ist wahrscheinlich keine gute allgemeine Lösung für das Problem. Dies war eine gute Lösung für mein Szenario, in dem die Alternative darin besteht, eine bereits vorhandene Anwendung grundlegend neu zu schreiben.
quelle
Update (01.11.2016)
Ich habe AmplifyJS verwendet, um dieses Problem zu umgehen. Bei Safari in Private Browsing wurde jedoch auf einen speicherbasierten Speicher zurückgegriffen. In meinem Fall war dies nicht angemessen, da der Speicher beim Aktualisieren gelöscht wird, auch wenn sich der Benutzer noch im privaten Browser befindet.
Außerdem habe ich eine Reihe von Benutzern bemerkt, die unter iOS Safari immer im privaten Modus surfen. Aus diesem Grund ist es für Safari ein besserer Fallback, Cookies zu verwenden (falls verfügbar). Standardmäßig sind Cookies auch beim privaten Surfen weiterhin verfügbar. Natürlich werden sie beim Verlassen des privaten Browsings gelöscht, aber beim Aktualisieren werden sie nicht gelöscht.
Ich habe die lokale Speicher-Fallback- Bibliothek gefunden. Aus der Dokumentation:
Vorsicht vor den Fallstricken:
TL; DR:
Verwenden Sie Local-Storage-Fallback (einheitliche API mit
.getItem(prop)
und.setItem(prop, val)
):Ursprüngliche Antwort
Eine mögliche Problemumgehung besteht darin, die Speichermethode zu ändern, um frühere Antworten zu ergänzen. Es gibt einige Bibliotheken wie AmplifyJS und PersistJS, die helfen können. Beide Bibliotheken ermöglichen dauerhaften clientseitigen Speicher über mehrere Backends.
Für AmplifyJS
Für PersistentJS
Sie bieten eine Abstraktionsschicht, sodass Sie sich keine Gedanken über die Auswahl des Speichertyps machen müssen. Beachten Sie jedoch, dass es je nach Speichertyp einige Einschränkungen (z. B. Größenbeschränkungen) geben kann. Im Moment verwende ich AmplifyJS, aber ich muss noch einige Tests unter iOS 7 / Safari / etc. Durchführen. um zu sehen, ob es das Problem tatsächlich löst.
quelle
Im April 2017 wurde ein Patch in Safari zusammengeführt, sodass er mit den anderen Browsern übereinstimmt. Dies wurde mit Safari 11 veröffentlicht.
https://bugs.webkit.org/show_bug.cgi?id=157010
quelle
Diese Frage und Antwort hat mir geholfen, ein bestimmtes Problem bei der Anmeldung neuer Benutzer in Parse zu lösen.
Da die Funktion signUp (attrs, options) lokalen Speicher verwendet, um die Sitzung beizubehalten, wird im privaten Browsermodus ein Benutzer mit der Meldung "QuotaExceededError: DOM-Ausnahme 22: Es wurde versucht, dem Speicher etwas hinzuzufügen, das das Kontingent überschreitet". Ausnahme und die Erfolgs- / Fehlerfunktionen werden niemals aufgerufen.
In meinem Fall schien es, da die Fehlerfunktion nie aufgerufen wird, zunächst ein Problem beim Auslösen des Klickereignisses beim Senden oder der Weiterleitung zu sein, die bei erfolgreichem Anmelden definiert wurde.
Das Hinzufügen einer Warnung für Benutzer hat das Problem behoben.
Analysieren Sie die Javascript SDK-Referenz https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
quelle