Google chrome extension 消息传递发生两次,如果;在“运行”处运行:&引用;文件“U开始”;用于镀铬扩展
在我的扩展中,我正在将一条消息从background.js传递到contentScript.js 问题是当我使用Google chrome extension 消息传递发生两次,如果;在“运行”处运行:&引用;文件“U开始”;用于镀铬扩展,google-chrome-extension,Google Chrome Extension,在我的扩展中,我正在将一条消息从background.js传递到contentScript.js 问题是当我使用 "run_at" : "document_start" 在我的manifest.json中,从background.js到contentScript.js的消息被调用了两次,有时甚至更多 在我的例子中,消息多次传递有点昂贵,因为我要向服务器发送一个调用,并且在服务器上多次处理相同的值是昂贵的 background.js chrome.tabs.onUpdated.addListen
"run_at" : "document_start"
在我的manifest.json中,从background.js到contentScript.js的消息被调用了两次,有时甚至更多
在我的例子中,消息多次传递有点昂贵,因为我要向服务器发送一个调用,并且在服务器上多次处理相同的值是昂贵的
background.js
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.sendMessage(tab.id, {type: "get-url", url: tab.url});
});
contentScript.js
chrome.runtime.onMessage.addListener(
function(message, sender, sendResponse) {
switch(message.type) {
case "get-url" : someFunction(message.url);
break;
// other cases
}
});
有没有办法解决这个问题?在选项卡更新周期中被多次调用(例如,当选项卡开始加载新页面时,当选项卡完成加载新页面时,当获取favicon时等)
最好的选择是在选项卡完成加载时选中CJ:
chrome.tabs.onUpdated.addListener(function (tabId, info, tab) {
if (info.status === 'complete') {
/* Now it is safe to send the message */
chrome.tabs.sendMessage(tabId, {
type: 'get-url',
url: tab.url
});
}
});
顺便说一句,当以编程方式注入时(不在
manifest.json
),属性的名称是runAt
,而不是run\u at
()。为了追踪导致第二条消息的问题,我们需要查看一些代码,我们不是吗?这与检查DOM是否已加载不同吗?如果您在文档_start
处注入内容脚本,并在选项卡状态为加载时发送消息,我不确定是否保证它将到达其接收者。您的具体要求是什么(即,您希望脚本何时运行)?我希望在获得当前选项卡的url后立即将消息发送到内容脚本。tab什么时候完成加载?是在DOM加载之后吗?或者在它之前?内容脚本将被注入到该选项卡或其他选项卡中吗?那么为什么不从内容脚本中获取URL呢??(例如window.location.href
)