Javascript 在不同浏览器中检测localStorage v sessionStorage对象

Javascript 在不同浏览器中检测localStorage v sessionStorage对象,javascript,internet-explorer,dojo,cross-browser,local-storage,Javascript,Internet Explorer,Dojo,Cross Browser,Local Storage,我正在编写一个Javascript类,它可以使用localStorage或sessionStorage。这是在类实例的基础上进行选择的 我在这个类中有一个方法,它接收存储对象作为参数,并根据存储类型(即本地v会话)运行一个操作 例如 这在InternetExplorer8中不起作用,产生错误:“类不支持自动化”。它在其他浏览器中似乎工作得很好 我试图获取对象类型(通过object.prototype.toString.call(store))并进行测试,但IE8始终为此报告[object]。我在

我正在编写一个Javascript类,它可以使用localStorage或sessionStorage。这是在类实例的基础上进行选择的

我在这个类中有一个方法,它接收存储对象作为参数,并根据存储类型(即本地v会话)运行一个操作

例如

这在InternetExplorer8中不起作用,产生错误:“类不支持自动化”。它在其他浏览器中似乎工作得很好

我试图获取对象类型(通过object.prototype.toString.call(store))并进行测试,但IE8始终为此报告[object]。我在回答问题时取得了一些进展:。这个变通方法让我在IE中获得了[对象存储]

但是,我仍然无法检测不同存储类型之间的差异。是否有一种简单的方法来检测跨浏览器工作的两种类型

我可以重写它,这样就不必将类型作为参数提供给方法。但是,我宁愿通过允许用户简单地提供存储对象来降低API的简单性。

您可以积极地使用IE8代码分支(受以下启发):

比较存储:

function storagesEqual(testStorage, webStorage) {
    try {
        return testStorage === webStorage;
    } catch (ex) {
        // IE8 code branch
        var testKey = "storage-test";
        var testValue = (new Date()).valueOf().toString();
        var result = false;

        try {
            webStorage.setItem(testKey, testValue);
            if(testStorage[testKey] === testValue) {
                webStorage.removeItem(testKey);
                result = true;
            }
        } finally {
            return result;
        }
    }
}
function storageType(store) {

    var STORAGE_LOCAL = 'local';
    var STORAGE_SESSION = 'session';
    var STORAGE_UNKNOWN = 'unknown';

    var localStorage = window.localStorage;
    var sessionStorage = window.sessionStorage;

    if(storagesEqual(store, localStorage)) return STORAGE_LOCAL;
    if(storagesEqual(store, sessionStorage)) return STORAGE_SESSION;
    return STORAGE_UNKNOWN;
}
确定存储类型:

function storagesEqual(testStorage, webStorage) {
    try {
        return testStorage === webStorage;
    } catch (ex) {
        // IE8 code branch
        var testKey = "storage-test";
        var testValue = (new Date()).valueOf().toString();
        var result = false;

        try {
            webStorage.setItem(testKey, testValue);
            if(testStorage[testKey] === testValue) {
                webStorage.removeItem(testKey);
                result = true;
            }
        } finally {
            return result;
        }
    }
}
function storageType(store) {

    var STORAGE_LOCAL = 'local';
    var STORAGE_SESSION = 'session';
    var STORAGE_UNKNOWN = 'unknown';

    var localStorage = window.localStorage;
    var sessionStorage = window.sessionStorage;

    if(storagesEqual(store, localStorage)) return STORAGE_LOCAL;
    if(storagesEqual(store, sessionStorage)) return STORAGE_SESSION;
    return STORAGE_UNKNOWN;
}

谢谢你。是的,如果我想让蛮力方法按照IE8的要求工作,那么蛮力方法可能是唯一的途径。想一想,我同意这一点;效率低下是可以接受的,因为它只会影响大约5%的用户。这些用户在使用IE8时已经体验到了显著的低效,因此在总体方案中,这可能并不重要。此外,这5%可能会随着时间的推移而减少。