在Chrome扩展程序的背景脚本和内容脚本之间难以传递消息

时间:2019-01-24 15:55:06

标签: javascript google-chrome google-chrome-extension chrome-runtime

我打算将内容脚本中的消息发送到后台脚本中,并作为回应发送响应。

这是我在后台脚本中得到的:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log("Message received");
    if(request.activeStatusRequest == "disable"){
      sendResponse({activeStatusUpdate: "disable"});
    }else if(request.activeStatusRequest == "enable"){
      sendResponse({activeStatusUpdate: "enable"});
    }
    return true;
});

chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) { console.log("Message received"); if(request.activeStatusRequest == "disable"){ sendResponse({activeStatusUpdate: "disable"}); }else if(request.activeStatusRequest == "enable"){ sendResponse({activeStatusUpdate: "enable"}); } return true; }); 这是我的内容脚本中提供的内容:

printReviews.onclick = function(element) {
  if(printReviews.classList.contains("activeButton")){
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
      chrome.tabs.executeScript(
          tabs[0].id,
          {code: `${injectionLiteralGETURL}`}
        );
    });

    toggleClasses(printReviews, "activeButton", "inactiveButton");

    chrome.runtime.sendMessage({activeStatusRequest: "disable"}, function(response){
      console.log("response received");
      console.log(response.activeStatusUpdate);
    });
  }
  else {
    toggleClasses(printReviews, "inactiveButton", "activeButton");
    chrome.runtime.sendMessage({activeStatusRequest: "enable"}, function(response){
      console.log("response received");
      console.log(response.activeStatusUpdate);
    });
  }
  };
上面的其余代码按预期工作,除了没有控制台控制台运行内容脚本中的日志。但是,后台脚本中的控制台日志确实可以运行。 有人对我做错了什么有想法吗?

1 个答案:

答案 0 :(得分:0)

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

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-script之间的回调,我更喜欢只播放消息,因为使用sendResponse时,它的工作方式会打开一个端口进行通信,但是如果发生更改(关闭选项卡,弹出窗口)关闭),您将遇到错误,因为端口也将关闭。 使用“完整发送消息的方式”,后台需要明确指定接收方标签。

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

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

希望这可以为您提供帮助