Javascript 检查本地存储是否可用

Javascript 检查本地存储是否可用,javascript,error-handling,local-storage,Javascript,Error Handling,Local Storage,我知道关于检查localStorage有很多问题,但是如果有人在浏览器中手动关闭它怎么办?下面是我用来检查的代码: localStorage.setItem('mod', 'mod'); if (localStorage.getItem('mod') != null){ alert ('yes'); localStorage.removeItem('mod'); } else { alert ('no'); } 简单的功能和它的工作。但是,如果我进入Chrome设置并选择“不保存数

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

localStorage.setItem('mod', 'mod');
if (localStorage.getItem('mod') != null){
  alert ('yes');
  localStorage.removeItem('mod');
} else {
  alert ('no');
}
简单的功能和它的工作。但是,如果我进入Chrome设置并选择“不保存数据”(我不记得它的确切名称)选项,当我尝试运行此函数时,只会得到
未捕获错误:SecurityError:DOM异常18
。那么,有没有办法检查这个人是否已经完全关机了

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


我会检查
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
}
使用的方法(您可能希望将我的函数名更改为更好的名称):

它不像其他方法那样简洁,但这是因为它的设计目的是最大限度地提高兼容性

原始资料来源:


工作示例:

使用此选项检查是否设置了本地存储。它可以帮助您获取本地存储的状态

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

           //action
   }else{
          }

修改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;
    }
  }
});
这是一个简单的检查:


if(本地存储的类型=='undefined'){

检测本地存储的功能很棘手。您需要实际接触它。原因是Safari选择在私有模式下提供一个功能性的
localStorage
对象,,但它的quotum设置为零。这意味着尽管所有简单的功能检测都会通过,但对
的任何调用都会通过>localStorage.setItem
将引发异常

Mozilla在Web存储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,您可以使用

然后使用如下函数:

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

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

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

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;
    }
}
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的浏览器将在窗口对象上有一个名为localStorage的属性。但是,由于各种原因,仅断言该属性存在可能会引发异常。如果它确实存在,这仍然不能保证localStorage实际可用,因为各种浏览器都提供禁用localStorage的设置。因此,浏览器可能支持localStorage,但不允许页面上的脚本使用它。其中一个例子是Safari,它在私人浏览模式下为我们提供了一个配额为零的空localStorage对象,实际上使其无法使用。但是,我们可能仍然会得到一个合法的QuoteAExceedeError,这只意味着我们已经用完了所有可用的存储年龄空间,但存储实际上是可用的。我们的功能检测应该考虑这些情况

请看这里


最好结合
cookies
检查
localStorage
的可用性,因为如果启用
cookie
,浏览器可以检测到
localStorage
可用,并且
将其键入
对象,但不提供使用它的可能性。您可以使用下一个函数来检测
localStorage
cookies

const isLocalStorage = () => {
  try {
    if (typeof localStorage === 'object' && navigator.cookieEnabled) return true
    else return false
  } catch (e) {
    return false
  }
}

在给定的情况下,这只是一个可以防止其他浏览器出错的功能…所以这并不能真正回答问题。如果关闭,
本地存储
仍然在
窗口中定义。
仍然会出现DOM错误…我真不敢相信没有办法检查它是否完全关闭…这不是一个错误Chrome和Opera的afe方法…可能也不是Safari,因为
localStorage
完全不可访问,并且会引发异常。您不需要所有
其他的
s…只需一次尝试就可以了。我看到您正在测试的结果实际上是
'yes'
,但我不知道在哪个用例中这是一个错误实际上是必要的。嘿,乔,我在运行函数(LS打开或关闭)“uncaughtsyntaxerror:非法返回语句”时遇到了这个错误@user2025469此代码旨在用作函数。抱歉,我应该提到这一点。我已经更新了我的答案并添加了一个演示,以便您可以看到它正常工作。Joe,这正是我一直在寻找的。当我打开LS时,它不可用。这只是一个基本的javascript函数,还是我需要在m中包含modernizr JSy script>当心!如果达到本地存储配额,此Modernizer方法将返回false。如果您有处理本地存储清理的函数,则应编辑catch语句,以便在异常名称
e.name==='quota\u超过\u ERR'
(Chrome)时启动适当的清理操作或
'NS\u错误\u DOM\u配额\u达到'
(Firefox/Safari)或者,如果IE中的
localStorage.remainingSpace===0
仍然没有提供任何方法来查看它是否工作…uhhhmm。如果它引发异常,则您知道它不工作可能是重复的,您不需要等待加载文档以访问localStorage(因此
$()
是无意义的)更重要的是,如果localStorage不可用,此代码将抛出错误。实际上,Mozilla文档声明,
localStorage
本质上是同步的,因此它可以阻止主文档的呈现。因此,等待主文档准备就绪是一个好方法。他们所说的
localStorage
是同步的意思是实际上,
localStorage.getItem('someKey')
立即返回t
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;
    }
}
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;
    }
}
const isLocalStorage = () => {
  try {
    if (typeof localStorage === 'object' && navigator.cookieEnabled) return true
    else return false
  } catch (e) {
    return false
  }
}