Javascript 在后台上下文中的脚本之间进行通信(后台脚本、浏览器操作、页面操作、选项页面等)
我在将数据从后台脚本发送到我的Javascript 在后台上下文中的脚本之间进行通信(后台脚本、浏览器操作、页面操作、选项页面等),javascript,iframe,google-chrome-extension,firefox-addon-webextensions,Javascript,Iframe,Google Chrome Extension,Firefox Addon Webextensions,我在将数据从后台脚本发送到我的pageAction脚本时遇到问题。我的内容脚本添加了一个,并且中的JavaScript正在从我的后台脚本接收数据,但它似乎没有在我的页面操作中检索到 在我的背景脚本中,我有如下内容: chrome.tabs.sendMessage(senderTab.tab.id, { foo:bar }); chrome.runtime.onMessage.addListener( function(request, sender, sendResponse)
pageAction
脚本时遇到问题。我的内容脚本添加了一个
,并且
中的JavaScript正在从我的后台脚本接收数据,但它似乎没有在我的页面操作中检索到
在我的背景脚本中,我有如下内容:
chrome.tabs.sendMessage(senderTab.tab.id,
{
foo:bar
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("received in iframe:", request);
}
});
其中senderTab.tab.id
是我的后台脚本中onMessage
侦听器中的“发送者”
在我的内容脚本注入的
加载的JavaScript中,我有如下内容:
chrome.tabs.sendMessage(senderTab.tab.id,
{
foo:bar
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("received in iframe:", request);
}
});
完全按照预期接收消息
我在我的页面_action.js
中放入了相同的JavaScript,但它没有从后台脚本接收任何数据。pageAction通过chrome.pageAction.show(senderTab.tab.id)激活代码>在我调用chrome.tabs.sendMessage(senderTab.tab.id…
附加到我的pageAction的HTML页面不是同一选项卡的一部分吗?因为这个tabId
使我能够激活/显示”图标,我认为pageAction的JavaScript中的侦听器也应该从chrome.tabs.sendMessage(senderTab.tab.id…
在我的内容脚本中,我使用以下命令将数据发送到后台脚本:
chrome.runtime.sendMessage({
foo: bar
});
当内容脚本发送上述消息时,pageAction JavaScript将接收该消息
如何让后台脚本正确地将数据发送到我的pageAction?我不希望有pageAction请求/轮询,而是希望pageAction只是侦听和接收。例如,如果显示的pageAction HTML,它应该能够随着后台页面的更改而实时更新。与后台内容中的页面通信xt 在后台上下文中打开的页面包括:
- ()
- (Firefox不支持事件页面。所有manifest.json页面。)
- ()
- ()
- (,)(在弹出窗口、选项卡或窗口中)
- (镀铬版不提供)
- 扩展名中包含的任何HTML内容,即,或frame.1
- 直接
从后台上下文中,您可以在获得对其全局范围、its、using()、()或()的引用后,在同样位于后台上下文中的另一个页面(即非内容脚本)中直接更改变量或调用函数。
例如,您可以使用以下方法调用在第一个返回视图的页面中使用
创建的函数:function myFunction
需要注意的是,在()或()的回调中,新打开的选项卡或窗口的视图可能还不存在。您需要使用一些方法来等待视图存在。2有关与新打开的选项卡或窗口通信的建议方法,请参阅下文 直接操作另一个页面范围中的值允许您传递所需的任何类型的数据winViews=chrome.extension.getViews(); winViews[0].myFunction(foo);
- 消息传递
使用()接收消息,3与()一起发送。每次您在
侦听器中收到消息时,都会提供一个运行时.onMessage
函数作为第三个参数,允许您直接响应消息。如果原始发件人在调用sendResponse
,则响应将丢失。如果使用承诺(例如,Firefox中的chrome.runtime.sendMessage()时未提供回调以接收此类响应
),则在承诺实现时,响应将作为参数传递。如果要异步发送响应,则需要从浏览器.runtime.sendMessage()
侦听器返回true; 端口运行时.onMessage
您还可以连接端口,使用()和()进行长期消息传递 使用
发送到内容脚本chrome.tabs.sendMessage()
如果要从后台上下文(例如后台脚本或弹出窗口)发送到内容脚本,可以使用
/chrome.tabs.sendMessage()
,或使用()/chrome.runtime.onMessage
chrome.runtime.onConnect连接端口 仅JSON可序列化数据
使用消息传递,您只能传递JSON可序列化的数据 消息由后台的所有脚本接收,但发件人除外
发送到后台上下文的消息由后台上下文中已注册侦听器的所有脚本接收,发送该消息的脚本除外。3无法指定仅由特定脚本接收。因此,如果您有多个潜在收件人,则需要创建一种方法以确保消息received用于该脚本。执行此操作的方法通常取决于消息中存在的特定属性(例如,使用
或目标
属性指示要接收的脚本,或定义某些收件人
的消息始终用于一个或另一个收件人),或根据提供给邮件处理程序的()进行区分(例如,如果来自一个发件人的邮件始终只针对特定的收件人)。没有固定的方法来执行此操作,您必须选择/创建一种方法来执行此操作,以便在扩展中使用 有关此问题的更详细讨论,请参阅:类型