Javascript Chrome消息扩展:从注入脚本到后台

Javascript Chrome消息扩展:从注入脚本到后台,javascript,google-chrome-extension,typescript,message,Javascript,Google Chrome Extension,Typescript,Message,后台在页面加载时自动注入JS脚本 在控制台(当前页面)中执行的所有测试都正常工作,并且后台正在接收消息 不幸的是,尽管后台很好地注入了加载页面的脚本,但它没有收到任何消息 对不起我的英语, 提前感谢您的回答 Jérémy-F您必须使用chrome.runtime.onMessage.addListener而不是chrome.runtime.onMessageExternal.addListener从您自己的内容脚本接收消息 chrome.runtime.onMessageExternal用于来自

后台在页面加载时自动注入JS脚本

在控制台(当前页面)中执行的所有测试都正常工作,并且后台正在接收消息

不幸的是,尽管后台很好地注入了加载页面的脚本,但它没有收到任何消息

对不起我的英语, 提前感谢您的回答


Jérémy-F

您必须使用
chrome.runtime.onMessage.addListener
而不是
chrome.runtime.onMessageExternal.addListener
从您自己的内容脚本接收消息


chrome.runtime.onMessageExternal
用于来自其他扩展/应用程序的消息。

如果您在自己的扩展内通信,则不需要
extensionID
外部可连接。要么问题缺少相关细节,要么代码不必要地过于复杂。@wOxxOm在我的实验中,将脚本直接注入网页上下文并尝试从注入的脚本发送消息,由于sendMessage调用不再位于扩展的上下文中,因此它总是抛出一个错误,即指定扩展ID。非常感谢!它起作用了!!您认为控制台被视为外部应用程序吗?控制台有一个上下文切换器下拉列表,所以您可以使用内部和外部上下文。外部上下文是所有其他扩展和站点页面。
/* My Background */
console.log("Init BackGround ! ");
chrome.runtime.onMessageExternal.addListener(
    (request, sender, sendResponse) => {
        console.log("J'ai bien reçu un truc");
        console.log(request);
        console.log(sender);
    }
);
    // Inject script
chrome.webNavigation.onCompleted.addListener((details) => {
    chrome.tabs.executeScript(details.tabId, {
        file: "include/ts/injectScript.js",
        runAt: "document_end"
    });
}, {url: [{urlPrefix: "https://website.com"}]});
console.log("End Background init");

/* My injected script */
    var extensionID = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    chrome.runtime.sendMessage(extensionID, {test : 123},(response) => {
        console.log(response);
    });

/* One part of my manifest.json (with good url) */
"externally_connectable": {
    "matches": [
      "*://*.exemple.com/tests/*"
    ]
 },
 "permissions": [..., "*://*.exemple.com/tests/*",...]