use*_*469 67 javascript error-handling local-storage
我知道有很多关于检查的问题localStorage但是如果有人在浏览器中手动关闭它会怎么样?这是我用来检查的代码:
localStorage.setItem('mod', 'mod');
if (localStorage.getItem('mod') != null){
alert ('yes');
localStorage.removeItem('mod');
} else {
alert ('no');
}
Run Code Online (Sandbox Code Playgroud)
功能简单,有效.但是,如果我进入我的Chrome设置并选择"不保存数据"选项(我不记得它的确切名称),当我尝试运行此功能时,我什么也得不到Uncaught Error: SecurityError: DOM Exception 18.那么有没有办法检查这个人是否完全关闭了?
更新:这是我尝试的第二个功能,我仍然没有得到任何响应(警报).
try {
localStorage.setItem('name', 'Hello World!');
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded!');
}
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*Joe 116
使用modernizr方法(您可能希望将我的函数名更改为更好的方法):
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
}
Run Code Online (Sandbox Code Playgroud)
它不像其他方法那样简洁,但这是因为它旨在最大限度地提高兼容性.
原始来源:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
工作示例:http://jsfiddle.net/6sm54/2/
Fre*_*k.L 15
我会检查localStorage是否在任何依赖于它的操作之前定义:
if (typeof localStorage !== 'undefined') {
var x = localStorage.getItem('mod');
} else {
// localStorage not defined
}
Run Code Online (Sandbox Code Playgroud)
更新:
如果您需要验证该功能是否存在以及它是否也未关闭,则必须使用更安全的方法.为了完全安全:
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
}
Run Code Online (Sandbox Code Playgroud)
检测功能的本地存储很棘手.你需要实际进入它.这样做的原因是Safari选择localStorage在私有模式下提供功能对象,但将其quotum设置为零.这意味着虽然所有简单的功能检测都会通过,但任何调用localStorage.setItem都会抛出异常.
Web Storage API上的Mozilla开发人员网络条目有一个关于检测本地存储的功能的专用部分.以下是该页面推荐的方法:
function storageAvailable(type) {
try {
var storage = window[type],
x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
}
catch(e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是您将如何使用它:
if (storageAvailable('localStorage')) {
// Yippee! We can use localStorage awesomeness
}
else {
// Too bad, no localStorage for us
}
Run Code Online (Sandbox Code Playgroud)
npm install -S storage-available
Run Code Online (Sandbox Code Playgroud)
然后像这样使用函数:
if (require('storage-available')('localStorage')) {
// Yippee! We can use localStorage awesomeness
}
Run Code Online (Sandbox Code Playgroud)
免责声明:MDN的文档部分和NPM包都是由我撰写的.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
支持 localStorage 的浏览器将在名为 localStorage 的窗口对象上有一个属性。但是,由于各种原因,仅断言属性存在可能会引发异常。如果确实存在,那仍然不能保证 localStorage 实际上可用,因为各种浏览器提供禁用 localStorage 的设置。因此浏览器可能支持localStorage,但不使其可用于页面上的脚本。一个例子是 Safari,它在隐私浏览模式下为我们提供了一个空的 localStorage 对象,其配额为零,实际上使其无法使用。但是,我们可能仍然会得到一个合法的 QuotaExceededError,这仅意味着我们已经用完了所有可用的存储空间,但存储实际上是可用的. 我们的特征检测应该考虑到这些场景。
有关特征检测 localStorage的简要历史,请参见此处。
通过此功能,您可以检查本地存储是否可用,并控制可能的异常。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74881 次 |
| 最近记录: |