Javascript background.js和内容脚本之间的通信?响应未定义

Javascript background.js和内容脚本之间的通信?响应未定义,javascript,jquery,google-chrome-extension,Javascript,Jquery,Google Chrome Extension,从内容脚本: chrome.runtime.sendMessage({ type: "getFormatOption" }, function (response) { return response === 'csv'; }); 我已经在控制台中检查过:background.js方法的SendResponse()中使用的值是OK。问题是响应总是未定义的。我做错了什么 background.js: chrome.runtime.onMessage.addListener( fu

从内容脚本:

chrome.runtime.sendMessage({ type: "getFormatOption" }, function (response) {
    return response === 'csv';
});
我已经在控制台中检查过:background.js方法的SendResponse()中使用的值是OK。问题是响应总是未定义的。我做错了什么

background.js:

chrome.runtime.onMessage.addListener(
    function (message, sender, sendResponse) {
        switch (message.type) {
            case 'getFormatOption':
                var response = $('input[name=csvOrEnter_radio]:checked', '#csvOrEnter_form').val();
                console.log('formatOption: ' + response);
                sendResponse(response);
                break;
            case 'getFilteringStrategy':
                var response = $('input[name=filteringStrategy_radio]:checked', '#filteringStrategy_form').val();
                console.log('filteringStrategy: ' + response);
                sendResponse(response);
                break;
            default:
                console.error('Unrecognised message: ', message);
        }
    }
);
我从plugin popup.html的单选按钮中获取一些值的想法

舱单:

   {
  // default for the latest version of Chrome extensions
  "manifest_version": 2,

  // extension related general info
  "name": "FB Interest Search Tool",
  "short_name": "FB Interest Search Tool",
  "description": "FB Interest Search Tool",
  "version": "1.0.0",

  "default_locale": "en",

  // sets path to popup files
  "browser_action": {
    "default_icon": "img/128.png",
    "default_popup": "popups/popup.html",
    "default_title": "FB Interest Search Tool"
  },

  // sets path to content scripts and when they are injected onto the page
  "content_scripts": [
    {
      "matches": [ "http://*/*", "https://*/*" ],
      "css": [ "styles/styles.css" ],
      "js": [
        "bower_components/jquery.min.js",
        "bower_components/jquery.cookie.js"
      ]
    }
  ],

  // sets path to background scripts
  "background": {
    "scripts": [
      "bower_components/jquery.min.js",
      "bower_components/jquery.cookie.js",
      "bg/background.js",
      "content-scripts/rewriteStorage.js"
    ]
  },

  "permissions": [
    "activeTab",
    "http://*/",
    "https://*/",
    "file:///*/*",
    "<all_urls>",
    "tabs",
    "storage",
    "unlimitedStorage",
    "storage",
    "cookies"
  ],

  "web_accessible_resources": [ "styles/commentblocker_on.css" ]
}
{
//最新版本的Chrome扩展的默认设置
“清单版本”:2,
//与扩展相关的一般信息
“名称”:“FB兴趣搜索工具”,
“短名称”:“FB兴趣搜索工具”,
“说明”:“FB兴趣搜索工具”,
“版本”:“1.0.0”,
“默认语言环境”:“en”,
//设置弹出文件的路径
“浏览器操作”:{
“默认图标”:“img/128.png”,
“默认弹出窗口”:“popups/popup.html”,
“默认标题”:“FB兴趣搜索工具”
},
//设置内容脚本的路径以及将其注入页面的时间
“内容脚本”:[
{
“匹配项”:[“http://*/*”,“https://*/*”],
“css”:[“styles/styles.css”],
“js”:[
“bower_components/jquery.min.js”,
“bower_components/jquery.cookie.js”
]
}
],
//设置后台脚本的路径
“背景”:{
“脚本”:[
“bower_components/jquery.min.js”,
“bower_components/jquery.cookie.js”,
“bg/background.js”,
“内容脚本/rewriteStorage.js”
]
},
“权限”:[
“活动标签”,
“http://*/”,
“https://*/”,
“文件://*/*”,
"",
“标签”,
“存储”,
“无限制存储”,
“存储”,
“饼干”
],
“web可访问资源”:[“styles/commentblocker\u on.css”]
}
问题1:它被称为
background.js
。 我一点也没开玩笑。也许有一点

由于它既包含在弹出窗口中,又作为后台脚本,因此注册了两个消息侦听器。以及:

注意:如果多个页面正在侦听
onMessage
事件,则只有第一个调用特定事件的
sendResponse()
才能成功发送响应。对该事件的所有其他响应将被忽略

猜猜谁先回答?我的赌注在后台,因为它首先注册了侦听器

如果您尝试调试,您仍然可以在弹出窗口中看到侦听器执行,但是由于后台已经应答,因此它的
sendResponse
被忽略

这个问题很容易解决:复制一个副本,调用它
popup.js
,并在两者中只保留相关的逻辑。不要在两个位置都包含相同的文件,除非您100%确定代码需要在两个位置都运行

问题2:弹出窗口是致命的。 当弹出窗口关闭时,它就死了,吉姆。它根本不存在:听众和单选按钮都不存在。因此,它无法回答该消息

要解决这一问题,需要重新设计体系结构。只有两个地方可以提供您随时可以查询的存储:

  • 背景页。它需要以非所选元素的方式保存状态,弹出窗口需要通知状态的更改
  • 。弹出窗口和内容脚本都可以对其进行读/写操作
对于选项,第二个更好。

问题1:它被称为
background.js
。 我一点也没开玩笑。也许有一点

由于它既包含在弹出窗口中,又作为后台脚本,因此注册了两个消息侦听器。以及:

注意:如果多个页面正在侦听
onMessage
事件,则只有第一个调用特定事件的
sendResponse()
才能成功发送响应。对该事件的所有其他响应将被忽略

猜猜谁先回答?我的赌注在后台,因为它首先注册了侦听器

如果您尝试调试,您仍然可以在弹出窗口中看到侦听器执行,但是由于后台已经应答,因此它的
sendResponse
被忽略

这个问题很容易解决:复制一个副本,调用它
popup.js
,并在两者中只保留相关的逻辑。不要在两个位置都包含相同的文件,除非您100%确定代码需要在两个位置都运行

问题2:弹出窗口是致命的。 当弹出窗口关闭时,它就死了,吉姆。它根本不存在:听众和单选按钮都不存在。因此,它无法回答该消息

要解决这一问题,需要重新设计体系结构。只有两个地方可以提供您随时可以查询的存储:

  • 背景页。它需要以非所选元素的方式保存状态,弹出窗口需要通知状态的更改
  • 。弹出窗口和内容脚本都可以对其进行读/写操作

对于选项,第二个选项更可取。

那么
background.js
与您的
popup.html
有什么关系?@Xan('input[name=filteringStrategy_radio]:checked','filteringStrategy_form')。val()它完美地读取了我单选按钮的值。很好用。我已经测试过了。您的意思是说
background.js
包含在您的
popup.html
中*气喘吁吁,就是这样。。语义肮脏。我的观点是,如果它不是(专门)用作后台脚本,那么它应该被称为除
background.js
之外的任何名称。当弹出窗口未显示时是否会发生错误?弹出窗口只能在显示时收听消息。当它关闭时,它的内容和监听器都会被破坏。
background.js
与你的
popup.html
有什么关系?@Xan('input[name=filteringStrategy\u radio]:checked','filteringStrategy\u form')。val()它完美地读取了我单选按钮的值。很好用。我已经测试过了。您的意思是说
background.js
包含在您的
popup.html
中*气喘吁吁,就是这样。。我的观点是,如果它不是(专门)用作背景脚本,它应该