Google chrome extension 消息传递发生两次,如果;在“运行”处运行:&引用;文件“U开始”;用于镀铬扩展

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

在我的扩展中,我正在将一条消息从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

    }
});
有没有办法解决这个问题?

在选项卡更新周期中被多次调用(例如,当选项卡开始加载新页面时,当选项卡完成加载新页面时,当获取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