【问题标题】:Chrome Extension Send message from background to content scriptChrome 扩展从后台发送消息到内容脚本
【发布时间】:2013-03-22 16:14:48
【问题描述】:

我是 chrome 扩展的新手,在这个问题上花了几个小时后,我决定问:

我的后台脚本只会在我重新加载扩展程序并快速切换到选项卡后向我的内容脚本发送一条消息。否则什么都不会发生。

 {
  "name": "Fixes",
  "version": "2",
  "manifest_version": 2,
  "description": "SomeFixes",
  "permissions": ["tabs", "http://*/*", "https://*/*", "storage"],
  "options_page": "options.html",
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "content_scripts": [
    {
      "matches": ["<all my urls>"],
      "js": ["jquery1.7.js", "helper.js"]
    }
  ],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "options.html"
  }
}

Background.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){

                chrome.tabs.sendMessage(tabs[0].id, {type:"test"}, function(response) {});  

});

helper.js

jQuery(document).ready(function() {
//Get allowed functions
chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

if(msg.type == "test"){

alert("test received");

});

警报框仅在重新加载扩展程序后触发并快速切换到应该显示警报框的选项卡。

所以我认为每次重新加载选项卡时都应该加载 background.js。但是现在它只加载一次,如果我不在那个选项卡上,它会在 helper.js 准备好发送响应之前加载。这就是我的理论。但正如我所说,我是新手,我很难理解它是如何工作的。

最终我想要完成的是让用户保存一些选项,这些选项将在每次页面加载时默认加载。在选项页面中保存选项工作得很好。弹出页面也可以正常工作。我只是无法加载默认选项,因为我无法将消息发送到内容脚本页面。

【问题讨论】:

    标签: jquery google-chrome-extension


    【解决方案1】:

    每次加载扩展时后台页面都会运行,并且由于它是一个事件页面,它将卸载并且任何事件都会再次执行您的代码。尝试这样做

    helper.js

    chrome.extension.sendMessage({text:"getStuff"},function(reponse){
      //This is where the stuff you want from the background page will be
      if(reponse.type == "test")
        alert("Test received");
    });
    

    background.js

    chrome.extension.onMessage.addListener(function(message,sender,sendResponse){
      if(message.text == "getStuff")
        sendResponse({type:"test"});
    });
    

    通过这种方式,内容脚本会启动信息流,因此您可以确定它已准备好接收它。

    【讨论】:

    • 谢谢。我不确定为什么不考虑在内容脚本中启动请求。非常感谢,现在更有意义了。在警报事件之后,我收到以下错误(它不会影响脚本,但它仍然是一个错误)“未定义”的事件处理程序中的错误:无法调用 null 的“断开连接”方法 TypeError:无法调用“断开连接”的方法空
    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2013-06-27
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多