3

我正在编写一个能够使用 localStorage 或 sessionStorage 的 Javascript 类。对此的选择是在类实例的基础上完成的。

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

例如。

function myMethod(store){
    // store: object storageObject
    //        The storage object being used (either
    //        sessionStorage or localStorage).

    if(store === sessionStorage){
        return sessionAction(store)
    }else if(store === localStorage){
        return localAction(store)
    }

    return null;
}

这在 Internet Explorer 8 中不起作用,产生错误:“类不支持自动化”。它似乎在其他浏览器中运行良好。

我试图获取对象类型(通过Object.prototype.toString.call( store ))并对此进行测试,但 IE8 总是为此报告 [object Object]。我设法从 Stackoverflow 问题的答案中取得了一些进展:Weird IE8 internal [[ class ]] attribute behavior。这个解决方法在 IE 中给了我 [object Storage]。

但是,我仍然无法检测到不同的存储类型。是否有一种简单的方法可以在跨浏览器工作的两种类型之间进行检测?

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

4

1 回答 1

2

您可以对 IE8 代码分支(受Modernizr启发)采取积极措施:

比较存储:

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;
}
于 2013-03-02T19:32:36.447 回答