IDBIndex: openKeyCursor() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

openKeyCursor() 方法是 IDBIndex 接口的一个方法,它返回一个 IDBRequest 对象,并在另一个线程中创建一个按照该索引排序的光标,该光标遍历指定的键范围。

该方法根据指定的方向将光标定位到相应的键。

如果未指定键范围或键范围为 null,则该范围将包含所有键。

注意: openKeyCursor() 返回的光标不会像 IDBIndex.openCursor 那样使引用的值可用。这使得获取键列表更加高效。

语法

js
openKeyCursor()
openKeyCursor(range)
openKeyCursor(range, direction)

参数

range 可选

用于光标范围的键或 IDBKeyRange。如果未传递任何值,则默认选择此对象存储中所有记录的键范围。

direction 可选

光标的 方向。有关可能的值,请参阅 IDBCursor 常量

返回值

一个 IDBRequest 对象,后续与此操作相关的事件会在此对象上触发。

如果操作成功,请求的 result 属性的值是

  • 指向第一个匹配给定查询的记录的 IDBCursor 对象
  • 如果未找到匹配的记录,则为 null

异常

此方法可能会抛出以下类型之一的DOMException

TransactionInactiveError DOMException

如果此 IDBIndex 的事务处于非活动状态,则会抛出此异常。

TypeError

如果方向参数的值无效,则抛出此异常。

DataError DOMException

如果提供的键或键范围包含无效键,则会抛出此异常。

InvalidStateError DOMException

如果 IDBIndex 已被删除或移除,则会抛出此异常。

示例

在下面的示例中,我们打开了一个事务和一个对象存储,然后从一个简单的联系人数据库中获取了索引 lName。然后,我们使用 openKeyCursor() 在该索引上打开了一个键光标。这与使用 IDBObjectStore.openKeyCursor 直接在 ObjectStore 上打开光标的工作方式相同,不同之处在于返回的记录是根据索引排序的,而不是主键。

最后,我们遍历索引中的每条记录,并将姓氏以及引用的记录的相应主键插入到 HTML 表中。

js
function displayDataByIndex() {
  tableEntry.textContent = "";
  const transaction = db.transaction(["contactsList"], "readonly");
  const objectStore = transaction.objectStore("contactsList");

  const myIndex = objectStore.index("lName");

  myIndex.openKeyCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const tableRow = document.createElement("tr");
      tableRow.appendChild(document.createElement("td")).textContent =
        cursor.key;
      tableRow.appendChild(document.createElement("td")).textContent =
        cursor.primaryKey;
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("All last names displayed.");
    }
  };
}

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbindex-openkeycursor①

浏览器兼容性

另见