我有一个网络扩展程序adddon,它由我的后台脚本,内容脚本和options_ui页面组成。内容脚本使用browser.runtime.sendMessage
向后台脚本发送消息,并期望从中获得响应,并且经常使用它所需的信息。后台脚本使用browser.runtime.onMessage.addListener
进行侦听。
选项页面预先执行可能需要1到5分钟的操作,因此它会告诉后台脚本执行此操作,并且后台脚本响应每1%到browser.tabs.sendMessage
都会更新一次。选项寻呼机注册一个browser.runtime.onMessage
监听器来监听此更新。
问题在于,只要选项页面处于打开状态,内容脚本就无法从后台脚本接收任何响应。它获得的任何响应始终为null。后台脚本肯定会从内容脚本接收请求,并使用正确的信息进行响应,但脚本没有收到响应。即使我打开了多个内容脚本,并且如果我按照我为选项页面的方式在每个脚本上注册一个browser.runtime.onMessage
侦听器,只要选项页面关闭,它就会工作
我不确定这里发生了什么,或接下来的步骤是什么。我知道runtime.onMessage
的文档说只有一个监听器可以响应,如果两个在同一个文档上注册,但除非选项页面与后台脚本计算在同一个文档中,否则它并不能真正做到感。我知道它不仅仅是Firefox的问题,因为Chrome中也会出现完全相同的行为。
答案 0 :(得分:2)
我无法找到任何解释或说明选项页面也是页面一部分的文档
注意:如果多个页面正在侦听onMessage事件,则只有第一个调用特定事件的sendResponse()才能成功发送响应。对该事件的所有其他回复都将被忽略。
但如文档中所述
https://developer.chrome.com/extensions/messaging#connect
长期连接
有时,进行长于单个请求和响应的对话非常有用。在这种情况下,您可以分别使用runtime.connect或tabs.connect打开从内容脚本到扩展页面的长期通道,反之亦然。通道可以选择使用名称,以便您区分不同类型的连接。
您应该使用connect
作为用例