尝试将消息从后台脚本传递到内容脚本时,我正在使用
chrome.tabs.query(
{active: true, currentWindow: true},
function(tabs) {
chrome.tabs.sendMessage(
tabs[0].id,
{greeting: "hello"},
function(response) {
console.log(response.farewell);
}
);
});
在后台脚本和相应的侦听器中
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting === "hello") {
sendResponse({farewell: "goodbye"});
}
});
在内容脚本中(根据the documentation)。
现在,我可能希望在当前标签的Web请求完成时向内容脚本发送内容,例如,
chrome.webRequest.onCompleted.addListener(
// sender code from above
)
但我发现,当内容脚本尚未注入页面时,后台脚本会发送消息。因此,没有回复。
如何解决这个问题?是否有一个事件可以在后台脚本中监听,告诉我何时加载了内容脚本?
答案 0 :(得分:3)
最安全的方法是从内容脚本发送消息,表明它已准备好,然后才从后台页面回复。
例如,您可以在每个标签ID中添加类似队列的内容,并在那里推送消息,当来自该标签的消息到达时,将队列提供给它。你也可以尝试使用程序化注入而不是清单注入:
webRequest
但是,如果您在导航已提交之前调用它,即在实际更改选项卡的上下文之前(可能会发生from .script3 import Class3A
个事件),您的脚本将尝试注入上一个页面并将被转换擦除。