javascript - 从另一个选项卡获取有关 IndexedDB 更新的事件

标签 javascript events indexeddb

如果我在多个选项卡中打开了 IndexedDB 数据库,我可以在不重新加载的情况下跟踪所有选项卡上的数据更改吗?

最佳答案

为了扩展 dumbmatter 的回答,这里是我如何使用 BroadcastChannel 实现它的。如果您需要更多支持,我建议您使用 postMessage而不是 BroadcastChannel。

function putThing(db, channel, thing) {
  return new Promise(function(resolve, reject) {
    const transaction = db.transaction('things', 'readwrite');
    transaction.oncomplete = function(event) {
      const message = {operation: 'updated', id: thing.id};
      channel.postMessage(message);
      resolve();
    };
    transaction.onerror = function(event) {
      reject(event.target.error);
    };

    const store = transaction.objectStore('things');
    store.put(thing);
  });
}

// In tab where operation occurs
const db = await open(...);
const channel = new BroadcastChannel('myChannel');
await putThing(db, channel, thing);
channel.close();
db.close();

// In other tab where you want observation of changes
const channel = new BroadcastChannel('myChannel');
channel.onmessage = function(event) {
  const message = event.data;
  console.log('A message occurred', message);
};

几点:

  • channel 不能向自己广播,所以它自己的 same-tab onmessage 监听器函数不会得到它的消息。但是,您可以在同一个选项卡上创建多个具有相同 channel 名称的 channel 实例,如果您需要该功能,每个 channel 都将收到其他 channel 的消息。
  • channel 应该是短暂的,所以在完成后关闭 channel 。然而,这也可能是您希望 channel 在页面打开时保持打开状态的情况
  • channel 消息遵循与在数据库中存储对象类似的限制,例如您只能传递简单属性值之类的数据,不能传递函数或自定义对象实例

关于javascript - 从另一个选项卡获取有关 IndexedDB 更新的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55647788/

相关文章:

javascript - 索引数据库 : Database Not Initialized

javascript - Passport.js 验证不工作

javascript - HTML:有什么方法可以确定一个元素是否在另一个元素后面?

javascript - 使用公共(public) JSON API 并将其显示为 html

c# - 使用C#,当MySql Server上发生数据库更改时触发事件

javascript - TransactionInactiveError 与后续的 put 调用

javascript - 我已经设法找到一种方法来通过使用每个幻灯片来获取我的幻灯片的文本,但是如何让它显示我的 jar 头产品而不是文本?

c# - Unity中的简单事件系统

java - Spring - 在事件上向 websocket 发送消息

javascript - indexedDB 最高键路径