内容和后台脚本之间的 onClick 通信不起作用

onClick communication between content and background scripts not working

我正在制作一个应用程序,在用户单击我的图标后突出显示当前页面中的关键字。我正在尝试在我的内容脚本和后台脚本之间进行通信。但是,我的代码不起作用。有谁知道应该怎么写?

这是我的内容脚本:

chrome.extension.onRequest.addListener(function(active,sender,sendResponse){
if(active.length>0){
jQuery(document).ready(function($) {
//rest of word highlighting code
}
})

这是我的 background.js :

chrome.browserAction.onClicked.addListener(function(tab) {

  chrome.extension.sendRequest(active);

});
  1. 不要使用已弃用的chrome.extension.sendRequest和匹配事件。它们陈旧、损坏且不受支持,这在文档中说得很清楚 - 这表明您没有去阅读它。

    正确使用的是chrome.runtime.sendMessage.onMessage,但签名是一样的。

  2. 好吧.. 为什么你希望它起作用? (除非你没有真正向我们展示所有相关代码,那是..没有帮助)

    chrome.browserAction.onClicked.addListener(function(tab) {
    
      // There is no "active" in the code anywhere to this point.
      //   It is treated like a variable name, one that was not yet used,
      //   so its contents are "undefined", and that's what you're sending.
      chrome.runtime.sendMessage(active);
      // Equivalent code: chrome.runtime.sendMessage(undefined);
    
    });
    

    接收端:

    chrome.runtime.onMessage.addListener(function(active,sender,sendResponse){
      // So, here "active" is undefined. It does not have a length
      //   parameter, and as such causes a fatal exception
      //   "Cannot read property 'length' of undefined"
      //   that you might have seen in the console of the page
      if(active.length>0){
        /* something */ 
      }
    })
    

无论您发送什么,通常但不总是对象(嗯,它必须是 JSON-可序列化的)。如果你只是想触发一些东西而不传递任何数据,有两个常用的约定,任何一个都可以:

  1. 将命令作为值传递。

    // Sender
    chrome.runtime.sendMessage({action: "active"});
    // Receiver
    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
      if(message.command == "active"){
        /* something */ 
      }
    
      // or, useful if you have many different commands:
    
      switch(message.command){
        case "active":
          /* something */
          break;
      }
    });
    
  2. 在消息中设置一个布尔值:

    // Sender
    chrome.runtime.sendMessage({active: true});
    // Receiver
    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
      if(message.active){
        /* something */ 
      }
    });