98

我知道有很多关于检查的问题,localStorage但是如果有人在他们的浏览器中手动关闭它怎么办?这是我用来检查的代码:

localStorage.setItem('mod', 'mod');
if (localStorage.getItem('mod') != null){
  alert ('yes');
  localStorage.removeItem('mod');
} else {
  alert ('no');
}

简单的功能,它的工作原理。但是,如果我进入 Chrome 设置并选择“不保存数据”选项(我不记得确切的名称),当我尝试运行此功能时,除了Uncaught Error: SecurityError: DOM Exception 18. 那么有没有办法检查这个人是否完全关闭了它?

更新:这是我尝试的第二个功能,但我仍然没有得到响应(警报)。

try {
  localStorage.setItem('name', 'Hello World!');
} catch (e) {
  if (e == QUOTA_EXCEEDED_ERR) {
   alert('Quota exceeded!');
  }
}
4

9 回答 9

145

使用modernizr's 方法(您可能希望将我的函数名称更改为更好的名称):

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
}

它不像其他方法那样简洁,但那是因为它旨在最大限度地提高兼容性。

原文来源:https ://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js

工作示例:http: //jsfiddle.net/6sm54/2/

于 2013-05-07T20:14:12.530 回答
29

我会检查localStorage在任何依赖它的操作之前定义的:

if (typeof localStorage !== 'undefined') {
    var x = localStorage.getItem('mod');
} else {
    // localStorage not defined
}

更新:

如果您需要验证该功能是否存在并且它也未被关闭,则必须使用更安全的方法。为了绝对安全:

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
}
于 2013-05-07T20:12:56.553 回答
21

功能检测本地存储很棘手。你需要真正进入它。这样做的原因是 Safari 选择localStorage在私有模式下提供功能对象,但它的配额设置为零。这意味着尽管所有简单的功能检测都会通过,但任何调用localStorage.setItem都会引发异常。

Mozilla 的 Web Storage API 上的开发者网络条目有一个关于特性检测本地存储的专门部分。这是该页面上推荐的方法:

function storageAvailable(type) {
    try {
        var storage = window[type],
            x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return false;
    }
}

以下是您将如何使用它:

if (storageAvailable('localStorage')) {
    // Yippee! We can use localStorage awesomeness
}
else {
    // Too bad, no localStorage for us
}

如果您使用的是 NPM,则可以使用以下方式获取可用存储空间

npm install -S storage-available

然后像这样使用函数:

if (require('storage-available')('localStorage')) {
    // Yippee! We can use localStorage awesomeness
}

免责声明:MDN 上的文档部分和 NPM 包都是由我编写的。

于 2017-01-04T11:30:04.857 回答
10

MDN更新了存储检测功能。2018年更靠谱:

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;
    }
}

支持 localStorage 的浏览器将在 window 对象上拥有一个名为 localStorage 的属性。但是,由于各种原因,仅仅断言属性存在可能会引发异常。如果它确实存在,那仍然不能保证 localStorage 确实可用,因为各种浏览器都提供了禁用 localStorage 的设置。因此,浏览器可能支持localStorage,但不使其用于页面上的脚本。其中一个例子是 Safari,它在隐私浏览模式下为我们提供了一个配额为零的空 localStorage 对象,实际上使其无法使用。但是,我们可能仍然会得到一个合法的 QuotaExceededError,这仅意味着我们已经用完了所有可用的存储空间,但存储实际上是可用的. 我们的特征检测应该考虑到这些场景。

有关特征检测 localStorage 的简史,请参见此处。

于 2018-10-05T18:07:32.427 回答
3

使用此功能,您可以检查本地存储是否可用,并控制可能的异常。

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;
    }
}
于 2017-10-05T08:26:43.657 回答
-1

最好与localStorage一起检查可用性cookies,因为如果cookie启用,浏览器可以检测到localStorage可用并且type它是object,但无法使用它。您使用下一个函数来检测localStoragecookies

const isLocalStorage = () => {
  try {
    if (typeof localStorage === 'object' && navigator.cookieEnabled) return true
    else return false
  } catch (e) {
    return false
  }
}
于 2021-01-15T10:47:09.483 回答
-1

修改 Joe 的答案以添加 getter 使其更易于使用。使用以下内容,您只需说: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;
    }
  }
});
于 2016-07-22T22:37:57.347 回答
-2

这是一个简单的检查:

if(typeof localStorage === 'undefined'){

于 2016-10-11T15:16:02.673 回答
-3

使用它来检查是否设置了 localStorage。它可以帮助您获得 Localstorage 的状态。

    if( window.localStorage.fullName !== undefined){

           //action
   }else{
          }
于 2014-01-09T06:50:04.440 回答