background.js和content-script之间的通信?回复未定

时间:2016-09-30 14:17:23

标签: javascript jquery google-chrome-extension

来自内容脚本:

chrome.runtime.sendMessage({ type: "getFormatOption" }, function (response) {
    return response === 'csv';
});

我在控制台中进行了检查:来自background.js方法的SendResponse()中使用的值是正常的。问题是响应总是不明确的。我做错了什么?

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);
        }
    }
);

我从插件popup.html中的radiobuttons中获取一些值的想法。

清单:

   {
  // 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" ]
}

1 个答案:

答案 0 :(得分:2)

问题1:它被称为background.js

我甚至没有开玩笑。 好吧也许一点点。

由于它在弹出窗口中包含BOTH并且作为后台脚本,因此注册了2个消息侦听器。 only one can answer

  

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

猜猜哪个先回答?我的投注是在幕后,因为它首先注册了听众。

如果您尝试调试时仍然看到侦听器在弹出窗口中执行,则会忽略其sendResponse,因为后台已经应答。

这个很容易解决:制作副本,称之为popup.js,并在两者中仅保留相关逻辑。不要在两个地方都包含相同的文件,除非您需要在两者中运行100%的特定代码。

问题2:弹出是致命的。

当弹出窗口关闭时 - 它已经死了,吉姆。它根本就不存在:既不是听众也不是无线电按钮。因此,它无法接听信息。

修复此问题需要重新构建体系结构。只有2个可以提供存储的地方,您可以随时查询

  • 背景页面。它需要以不同于所选元素的方式保持状态,弹出窗口需要告知状态的变化。
  • chrome.storage API。弹出窗口和内容脚本都可以读/写它。

对于选项,第二个是优选的。