Ich weiß, es gab viele Fragen zum Überprüfen, localStorage
aber was ist, wenn jemand es manuell in seinem Browser ausschaltet? Hier ist der Code, mit dem ich überprüfe:
localStorage.setItem('mod', 'mod');
if (localStorage.getItem('mod') != null){
alert ('yes');
localStorage.removeItem('mod');
} else {
alert ('no');
}
Einfache Funktion und es funktioniert. Wenn ich jedoch in meine Chrome-Einstellungen gehe und die Option "Daten nicht speichern" wähle (ich erinnere mich nicht genau, wie sie heißt), erhalte ich beim Ausführen dieser Funktion nur Uncaught Error: SecurityError: DOM Exception 18
. Gibt es also eine Möglichkeit zu überprüfen, ob die Person es vollständig ausgeschaltet hat?
UPDATE: Dies ist die zweite Funktion, die ich ausprobiert habe, und ich erhalte immer noch keine Antwort (Warnung).
try {
localStorage.setItem('name', 'Hello World!');
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded!');
}
}
javascript
error-handling
local-storage
user2025469
quelle
quelle
Antworten:
Verwenden Sie
modernizr
den Ansatz von (vielleicht möchten Sie meinen Funktionsnamen in etwas Besseres ändern):function lsTest(){ var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch(e) { return false; } } if(lsTest() === true){ // available }else{ // unavailable }
Es ist nicht so präzise wie andere Methoden, aber das liegt daran, dass es die Kompatibilität maximiert.
Die ursprüngliche Quelle: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
Arbeitsbeispiel: http://jsfiddle.net/6sm54/2/
quelle
e.name ==== 'QUOTA_EXCEEDED_ERR'
(Chrome) oder'NS_ERROR_DOM_QUOTA_REACHED'
(Firefox / Safari) oderlocalStorage.remainingSpace === 0
im IE vorhanden ist.Ich würde überprüfen, ob dies
localStorage
definiert ist, bevor eine Aktion davon abhängt:if (typeof localStorage !== 'undefined') { var x = localStorage.getItem('mod'); } else { // localStorage not defined }
AKTUALISIEREN:
Wenn Sie überprüfen müssen, ob die Funktion vorhanden ist und auch nicht deaktiviert ist, müssen Sie einen sichereren Ansatz verwenden. Um ganz sicher zu gehen:
if (typeof localStorage !== 'undefined') { try { localStorage.setItem('feature_test', 'yes'); if (localStorage.getItem('feature_test') === 'yes') { localStorage.removeItem('feature_test'); // localStorage is enabled } else { // localStorage is disabled } } catch(e) { // localStorage is disabled } } else { // localStorage is not available }
quelle
localStorage
immer noch in definiertwindow
.localStorage
vollständig darauf zugegriffen werden kann und eine Ausnahme ausgelöst wird.else
s ... Nur ein einziger Versuch sollte reichen. Ich sehe, dass Sie testen, ob das Ergebnis tatsächlich ist'yes'
, aber ich habe keinen Anwendungsfall, in dem dies tatsächlich notwendig ist.Das Erkennen von lokalem Speicher mit Funktionen ist schwierig. Sie müssen tatsächlich hinein greifen. Der Grund dafür ist, dass Safari beschlossen hat, ein Funktionsobjekt
localStorage
im privaten Modus anzubieten , dessen Quotum jedoch auf Null gesetzt ist . Dies bedeutet, dass, obwohl alle einfachen Funktionserkennungen erfolgreich sind, alle Aufrufe vonlocalStorage.setItem
eine Ausnahme auslösen.Der Mozilla Developer Network-Eintrag in den Web Storage-APIs enthält einen eigenen Abschnitt zum Erkennen von lokalem Speicher . Hier ist die auf dieser Seite empfohlene Methode:
function storageAvailable(type) { try { var storage = window[type], x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return false; } }
Und so würden Sie es verwenden:
if (storageAvailable('localStorage')) { // Yippee! We can use localStorage awesomeness } else { // Too bad, no localStorage for us }
Wenn Sie NPM verwenden, können Sie greifen Speicher verfügbar mit
Verwenden Sie dann die folgende Funktion:
if (require('storage-available')('localStorage')) { // Yippee! We can use localStorage awesomeness }
Haftungsausschluss : Sowohl der Dokumentationsabschnitt zu MDN als auch das NPM-Paket wurden von mir verfasst.
quelle
MDN hat die Speichererkennungsfunktion aktualisiert . Im Jahr 2018 ist es zuverlässiger:
function storageAvailable() { try { var storage = window['localStorage'], x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return e instanceof DOMException && ( // everything except Firefox e.code === 22 || // Firefox e.code === 1014 || // test name field too, because code might not be present // everything except Firefox e.name === 'QuotaExceededError' || // Firefox e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && // acknowledge QuotaExceededError only if there's something already stored storage && storage.length !== 0; } }
quelle
This isn't the exact behavior I'm seeing in Safari with iOS 12.1. I'm able to set things and retrieve them - they just don't persist after I close that tab.
Ja. Zum Glück wurden die WebKit-Entwickler schlau und änderten das fehlerhafte Verhalten. In alten Versionen werfen sie Quotenüberschreitungsfehler aus und versuchen, im privaten Modus in localStorage zu schreiben. Dies ist unerwartet und hat den Entwicklern viele Probleme bereitet. In späteren Versionen haben sie es geändert, um es an das Verhalten anderer Browser und Cookies anzupassen: Es funktioniert, aber nur solange der Browser geöffnet bleibt.Mit dieser Funktion können Sie prüfen, ob localstorage verfügbar ist oder nicht, und die möglichen Ausnahmen unter Kontrolle halten.
function isLocalStorageAvailable() { try { var valueToStore = 'test'; var mykey = 'key'; localStorage.setItem(mykey, valueToStore); var recoveredValue = localStorage.getItem(mykey); localStorage.removeItem(mykey); return recoveredValue === valueToStore; } catch(e) { return false; } }
quelle
Das Ändern von Joes Antwort, um einen Getter hinzuzufügen, erleichtert die Verwendung. Mit dem Folgenden sagen Sie einfach:
if(ls)...
Object.defineProperty(this, "ls", { get: function () { var test = 'test'; try { localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch(e) { return false; } } });
quelle
ls
ist besser als das TippenlsTest() === true
. ...?ls
... ein Objekt zu, das als solchesif (ls)
immer ausgewertet wirdtrue
. Überprüfen Sie es einfach, indem Sie Ihreget
Methode auf Lesen ändern ,get: function(){return false}
und Sie werden sehen. Außerdem ist das Tippenls
nicht besser ... Dieser Test wird nicht zu oft in Ihrem Code enthalten sein (wenn Sie ihn auf intelligente Weise schreiben). Warum sollten Sie also den (globalen) Bereich mit einer sehr kurzen Variablen verschmutzen?if(ls){...
lohnt.Hier ist eine einfache Überprüfung:
if(typeof localStorage === 'undefined'){
quelle
localStorage
Rückgabeobject
, auch wenn sie in Firefox oder IE deaktiviert ist. In Chrome und Operatypeof
löst eine Ausnahme aus und bricht das gesamte Skript, wenn der Benutzer eslocalStorage
mit einem Kontingent von Null und lösen daher eine Ausnahme aus, wenn Sie versuchen, darauf zu schreiben. Aus diesem Grund versucht die lokale Speicherfunktion, die jetzt Code erkennt, immer, ein Element zu schreiben.Verwenden Sie diese Option, um zu überprüfen, ob localStorage festgelegt ist oder nicht. Es hilft Ihnen, den Status von Localstorage zu erhalten.
if( window.localStorage.fullName !== undefined){ //action }else{ }
quelle
$()
ist also sinnlos). Noch wichtiger ist, dass dieser Code einen Fehler auslöst, wenn localStorage nicht verfügbar ist.localStorage
synchronen Status an, sodass das Rendern des Hauptdokuments blockiert werden kann. Es wäre daher ein guter Ansatz, darauf zu warten, dass es fertig ist.localStorage
synchron sind, ist, dasslocalStorage.getItem('someKey')
der Artikel tatsächlich sofort zurückgegeben wird. Es akzeptiert keine Rückruffunktion oder gibt a zurückPromise
, sondern gibt die Daten sofort zurück. Vergleichen Sie das mit zBvar result = fetch('https://example.com/data.json')
... das gibt a zurückPromise
, was es asynchron macht. Sie müssen diethen
Methode aufrufen , um an die Daten zu gelangen (wird nur beim nächsten Tick auftreten):result.then(function(data){ /* only here do we get the data */ })