不规则的消息检测

时间:2014-10-11 22:17:45

标签: javascript google-chrome-extension

我正在开发一个简单的扩展,根据浏览器中的某些用户操作,将消息发送到弹出脚本,然后弹出脚本调用后台脚本中的函数。我是开发Chrome扩展程序的新手,所以请耐心等待。

目前,我有一个设置,可以使用内容脚本检测浏览器中的用户操作,向弹出脚本发送消息,并在检测到的背景页面中调用函数(或者我相信,我还没有得到)警报或日志显示在background.js)的任何地方。

我的问题是:为什么从后台脚本发送时没有检测到消息,并且我的后台脚本中的函数是否被调用?

的manifest.json

{
  ...
  "browser_action": {
    "default_icon": "gamify.png",
    "default_popup": "user_stats.html"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["jquery.min.js", "contentscript.js"],
      "run_at": "document_end"
    }
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "permissions": [
    "storage"
  ]
}

contentscript.js

$(document).ready(function() {
  $("#page-container").click(function() {
    chrome.runtime.sendMessage({
      action: "Load"
    });
  });
});

//弹出脚本

$(document).ready(function() {

  var bg = chrome.extension.getBackgroundPage();

  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    var action = request.action;
    if (action == "Load") {
      bg.initialize();
    }
  });
});

background.js

function initialize() {

  chrome.runtime.sendMessage({
    action: "Start"
  });

  chrome.storage.sync.get("initialized", function(data) {
    alert("BS: Get initialized: " data);
    //Do stuff here
  });
}

1 个答案:

答案 0 :(得分:0)

你为什么要以迂回的方式这样做?

弹出页面只有在显示时才存在;如果弹出窗口未打开,则没有任何内容会收听您的消息并且会丢失。由于它非常脆弱,因此它不适合用于消息路由。

因此,步骤1:从弹出窗口中删除消息路由。在意识形态上,后台页面“始终存在”,并处理大多数操作。您可以通过监听chrome.storage.onChanged或仅对弹出窗口有意义的不同消息来控制弹出窗口的显示。


但是,您还声明背景页面有"persistent" : false,即它是Event page。这意味着它总是总是

顺便说一下,如果页面被卸载,这会导致chrome.extension.getBackgroundPage不时失败。

您有两种选择:

  1. 删除"persistent": false。事件页面更难处理,所以如果你是新手,你可能想跳过它。

  2. 仔细阅读活动页面文档。它列出了您必须处理的限制。