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 で [オブジェクト ストレージ] が表示されました。

ただし、異なるストレージ タイプを検出することはまだできません。クロスブラウザーで動作する 2 つのタイプを検出する簡単な方法はありますか?

メソッドのパラメーターとして型を指定する必要がないように書き直すことができます。ただし、ユーザーが単純にストレージ オブジェクトを提供できるようにすることで、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 に答える