5

IDBObjectStore.getAllこれはIndexedDB標準の一部ではなく、決して含まれない可能性があることを認識しています。ただし、FireFoxに実装されているため、データベースから多くのオブジェクトを取得する必要がある場合は、コードがよりきれいになります。

getAllIndexedDBをサポートする他のブラウザで動作できるように、ある種のポリフィルなどを作成することは可能でしょうか?の実際の機能getAllは単純ですが、Firefox以外のブラウザで正確な構文を複製するというコンテキストで、IndexedDBの非同期の性質を処理する方法がわかりません。

4

1 に答える 1

12

他のブラウザでgetAllをサポートするためにシムのGitHubリポジトリを作成しました。これは、Chromeでは十分に機能するようです。コードは後世のために以下で繰り返されます:

(function () {
    "use strict";

    var Event, getAll, IDBIndex, IDBObjectStore, IDBRequest;

    IDBObjectStore = window.IDBObjectStore || window.webkitIDBObjectStore || window.mozIDBObjectStore || window.msIDBObjectStore;
    IDBIndex = window.IDBIndex || window.webkitIDBIndex || window.mozIDBIndex || window.msIDBIndex;

    if (typeof IDBObjectStore.prototype.getAll !== "undefined" && typeof IDBIndex.prototype.getAll !== "undefined") {
        return;
    }

    // https://github.com/axemclion/IndexedDBShim/blob/gh-pages/src/IDBRequest.js
    IDBRequest = function () {
        this.onsuccess = null;
        this.readyState = "pending";
    };
    // https://github.com/axemclion/IndexedDBShim/blob/gh-pages/src/Event.js
    Event = function (type, debug) {
        return {
            "type": type,
            debug: debug,
            bubbles: false,
            cancelable: false,
            eventPhase: 0,
            timeStamp: new Date()
        };
    };

    getAll = function (key) {
        var request, result;

        key = typeof key !== "undefined" ? key : null;

        request = new IDBRequest();
        result = [];

        // this is either an IDBObjectStore or an IDBIndex, depending on the context.
        this.openCursor(key).onsuccess = function (event) {
            var cursor, e, target;

            cursor = event.target.result;
            if (cursor) {
                result.push(cursor.value);
                cursor.continue();
            } else {
                if (typeof request.onsuccess === "function") {
                    e = new Event("success");
                    e.target = {
                        readyState: "done",
                        result: result
                    };
                    request.onsuccess(e);
                }
            }
        };

        return request;
    };

    if (typeof IDBObjectStore.prototype.getAll === "undefined") {
        IDBObjectStore.prototype.getAll = getAll;
    }
    if (typeof IDBIndex.prototype.getAll === "undefined") {
        IDBIndex.prototype.getAll = getAll;
    }
}());
于 2012-08-26T14:48:05.177 に答える