在我的扩展程序中,我将一条消息从background.js传递给contentScript.js。
问题是当我使用
时"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
}
});
有没有办法解决这个问题?
答案 0 :(得分:2)
chrome.tabs.onUpdated
(例如,当选项卡开始加载新页面时,选项卡完成加载新页面时,获取favicon时等)。
最好的选择是在标签完成加载时checj:
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
});
}
});
BTW,在以编程方式注入时(不在manifest.json
中),属性的名称为runAt
,而不是run_at
( docs )。< / p>