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