内容和后台脚本之间的onClick通信无效

时间:2015-08-04 01:31:27

标签: google-chrome google-chrome-extension content-script

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

这是我的内容脚本:

kind_of? B.singleton_class

这是我的background.js:

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

1 个答案:

答案 0 :(得分:1)

  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 */ 
      }
    })
    
  3. 无论发送什么,通常(但不总是)一个对象(嗯,它必须是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 */ 
        }
      });