Google chrome extension 如何将消息从内容脚本发送到非活动弹出窗口,chrome扩展

Google chrome extension 如何将消息从内容脚本发送到非活动弹出窗口,chrome扩展,google-chrome-extension,Google Chrome Extension,我想将任何网页上的文本(使用内容脚本处理选择)记录到一个数据库中,该数据库是popup的资源,以便在一个地方收集文本 我在尝试什么 我在弹出页面中创建了一个数据库,并尝试通过内容脚本对其进行管理,尽管通过使用chrome消息,弹出窗口未处于活动状态(未打开),但无法使弹出窗口接收来自内容脚本的任何消息 我不确定是否使用消息传递来解决此问题。 有更好的解决方案吗?内容脚本无法向不可见的弹出窗口发送消息,因为隐藏时弹出窗口的上下文处于非活动(关闭)状态 你的问题有几种解决办法 选项1:无消息传递,使

我想将任何网页上的文本(使用内容脚本处理选择)记录到一个数据库中,该数据库是popup的资源,以便在一个地方收集文本

我在尝试什么 我在弹出页面中创建了一个数据库,并尝试通过内容脚本对其进行管理,尽管通过使用chrome消息,弹出窗口未处于活动状态(未打开),但无法使弹出窗口接收来自内容脚本的任何消息

我不确定是否使用消息传递来解决此问题。
有更好的解决方案吗?

内容脚本无法向不可见的弹出窗口发送消息,因为隐藏时弹出窗口的上下文处于非活动(关闭)状态

你的问题有几种解决办法

选项1:无消息传递,使用存储事件 如果您的“数据库”实际上是一个简单的键值存储,请切换到API。此API可用于内容脚本和弹出窗口,并附带一个事件来通知您值的更改

例如:

// Get notified of changes (in the popup?)
chrome.storage.onChanged.addListener(function(changes, areaName) {
    // Do whatever you want with the changes.
});
// Initialization of the popup (print initial information?)
chrome.storage.local.get({keyName: 'defaultValue'}, function(items) {
    // Do something with items.keyName
});

// Content script, storage (remember document title?)
chrome.storage.local.set({keyName: document.title});
选项2:将消息传递到后台/事件页面 弹出窗口和/页面共享相同的过程。任何绑定到弹出窗口的数据库也可用于后台页面,反之亦然。此方法的高级概述:

  • 内容脚本向后台页面发送消息
  • 后台页面将值存储在数据库中
  • 如果弹出窗口打开,更新弹出窗口的视图
  • 如果弹出窗口被打开(因此它以前是关闭的),它应该读取数据库(或者直接读取,或者使用从后台页面读取数据)并处理结果

  • 我已经在中提供了与此流程对应的代码。

    谢谢:D选项2对我来说可以,但在步骤(3)中我仍然很挣扎。通过从后台页面调用getViews方法,我无法获取弹出页面的任何窗口对象。它只是返回了一个本身的窗口对象(背景页)。@Jing你打开弹出窗口了吗?如果没有,则弹出窗口将不会显示在
    getViews()
    中,因为该视图处于非活动状态。这就是第四步存在的原因(如果弹出窗口的视图总是可见的,那么第三步总是会成功,第四步是不必要的)。哦,我没有像你说的那样打开弹出窗口。最后,我使用了与后台视图相同的popup视图,并在后台脚本中添加了
    chrome.runtime.onMessage.addListener
    。无论如何,我只知道bg和popup在同一个进程中运行,谢谢@robw