Javascript 在chrome扩展中,在后台和内容脚本之间传递消息很困难

Javascript 在chrome扩展中,在后台和内容脚本之间传递消息很困难,javascript,google-chrome,google-chrome-extension,chrome-runtime,Javascript,Google Chrome,Google Chrome Extension,Chrome Runtime,我正在尝试将一条消息从内容脚本发送到后台脚本,并发送一个响应 这是我的背景脚本中的内容: 这是我在内容脚本中得到的: 上述代码的其余部分按预期工作,除了运行内容脚本时没有控制台日志。不过,后台脚本中的控制台日志确实会运行。 有人知道我做错了什么吗?如果您想尝试其他方法,可以尝试在内容脚本中添加一个侦听器 Content.js chrome.runtime.onMessage.addListener( function(request, sender, sendResp

我正在尝试将一条消息从内容脚本发送到后台脚本,并发送一个响应

这是我的背景脚本中的内容:

这是我在内容脚本中得到的:

上述代码的其余部分按预期工作,除了运行内容脚本时没有控制台日志。不过,后台脚本中的控制台日志确实会运行。
有人知道我做错了什么吗?

如果您想尝试其他方法,可以尝试在内容脚本中添加一个侦听器

Content.js

    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        console.log("Message received  from background", response.type, response.activeStatusUpdate);
        switch(request.type){
            case 'SomeFirstAction'
                break;

            case 'SomeSecondAction'
                break;
        }

    });

Background.js

    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        console.log("Message received");
        if(request.activeStatusRequest == "disable"){
          sendMessageToCurrentTab({type: 'SomeFirstAction', activeStatusUpdate: "disable"});
        }else if(request.activeStatusRequest == "enable"){
          sendMessageToCurrentTab({type: 'SomeSecondAction', activeStatusUpdate: "enable"});
        }
        // return true; -> not needed with that method
    });


    function sendMessageToCurrentTab(message){
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
            chrome.tabs.sendMessage(tabs[0].id, message);
        }
    }
要在popup/background/content脚本之间播放回调,我更喜欢只播放消息,因为当使用sendResponse时,它的工作方式会打开一个端口进行通信,但是如果发生更改(选项卡关闭、弹出关闭),您将有一个错误,因为端口也将关闭。 使用“完全发送消息方式”,后台需要清楚地指向receiver选项卡

我还建议您使用一个类型或一些独特的操作属性,因为所有侦听器都将侦听所有操作。它将确定行动及其目的。 在这里,我只是在内容脚本中使用了一个开关,但是后台可以使用相同的逻辑

也许这不是最好的做事方式,但对我来说效果很好


希望这能帮助您

1)您不能在内容脚本中使用chrome.tabs-那里只允许使用3或4个基本API。将其移动到背景脚本。2) 如果不从异步调用调用sendResponse,则不需要“return true”。3) 开始使用devtools调试器,您可以在代码中设置断点,逐步执行它,并检查变量、状态和DOM。4) 编辑内容脚本代码时,请确保重新加载上的两个扩展名chrome://extensions 页面和网页,以便注入新代码。5) 如果这没有帮助,请在问题中添加manifest.json。@wOxxOm感谢您的回答。我现在不在我的电脑上,明天将进行更改。1) 那很有趣。代码“injectionLiteralGETURL”的注入似乎完全按照预期工作。可能我对内容脚本是什么有错误的想法?我的“内容脚本”的文件名是popup.js,它是一个链接到我的popup.html的脚本。2)谢谢,我会更改它。3)我以前使用过它,但似乎无法确定它是如何出错的。我会再试一次。4)是的,一直在这样做。5)我回到电脑后会添加manifest.json。谢谢你的帮助。确实是一个浏览操作弹出脚本不是一个内容脚本,因此您可以在那里使用chrome.tabs。那么我将无法在这两个脚本之间传递消息吗?假设您的背景脚本确实是一个背景脚本(在manifest.json中正确声明),你可以。一个常见的错误是在同一个popup.html中加载背景脚本。由于弹出脚本可以做任何事情,所以不清楚为什么需要背景脚本。
    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        console.log("Message received  from background", response.type, response.activeStatusUpdate);
        switch(request.type){
            case 'SomeFirstAction'
                break;

            case 'SomeSecondAction'
                break;
        }

    });

    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        console.log("Message received");
        if(request.activeStatusRequest == "disable"){
          sendMessageToCurrentTab({type: 'SomeFirstAction', activeStatusUpdate: "disable"});
        }else if(request.activeStatusRequest == "enable"){
          sendMessageToCurrentTab({type: 'SomeSecondAction', activeStatusUpdate: "enable"});
        }
        // return true; -> not needed with that method
    });


    function sendMessageToCurrentTab(message){
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
            chrome.tabs.sendMessage(tabs[0].id, message);
        }
    }