IDBIndex:openCursor() 方法

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

IDBIndex 接口的 openCursor() 方法返回一个 IDBRequest 对象,并在单独的线程中,在指定的键范围内创建一个 游标

该方法根据指定的方向将游标的位置设置为相应的记录。

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

语法

js
openCursor()
openCursor(range)
openCursor(range, direction)

参数

range 可选

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

direction 可选

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

返回值

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

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

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

异常

此方法可能会引发以下类型之一的 DOMException

TransactionInactiveError DOMException

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

TypeError

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

DataError DOMException

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

InvalidStateError DOMException

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

示例

在以下示例中,我们打开一个事务和一个对象存储,然后从一个简单的联系人数据库中获取索引 lName。然后,我们使用 openCursor() 在索引上打开一个基本游标 - 这与使用 IDBObjectStore.openCursor 直接在 ObjectStore 上打开游标相同,只是返回的记录根据索引排序,而不是主键。

最后,我们遍历每条记录,并将数据插入 HTML 表格中。有关完整的可运行示例,请参阅我们的 IndexedDB-examples 演示存储库查看示例)。

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

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

  myIndex.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const tableRow = document.createElement("tr");
      for (const cell of [
        cursor.value.id,
        cursor.value.lName,
        cursor.value.fName,
        cursor.value.jTitle,
        cursor.value.company,
        cursor.value.eMail,
        cursor.value.phone,
        cursor.value.age,
      ]) {
        const tableCell = document.createElement("td");
        tableCell.textContent = cell;
        tableRow.appendChild(tableCell);
      }
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("Entries all displayed.");
    }
  };
}

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbindex-opencursor②

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅