【问题标题】:chrome extension: sharing an object between content scripts and background scriptchrome 扩展:在内容脚本和后台脚本之间共享一个对象
【发布时间】:2012-12-03 10:07:46
【问题描述】:

我正在开发一个在内容脚本中使用 jQuery/Zepto 的 chrome 扩展。现在,该扩展程序可以在每个网站上运行,这意味着用户打开的每个选项卡上都会加载 jQuery/Zepto 的副本。

有没有办法在各种内容脚本之间共享 jQuery/Zepto 对象?

我知道内容脚本可以与后台脚本通信。我希望能够让后台脚本能够访问 jQuery 对象并返回对它的引用,以及对每个内容脚本的引用。但我意识到只有 JSON 消息可以在内容和后台脚本之间传递。

有什么方法可以实现我想要的吗?

【问题讨论】:

  • 不,您不能在内容脚本之间共享直接函数引用。 (重复问题:How to transfer data between the content scripts of two different tabs?)。
  • 将此作为答案发布,我会接受。顺便说一句,一个问题 - 我昨天认为让 jQuery 包含在每个页面中实际上可能不是问题,因为与网页的实际资源不同,它不必下载。鉴于网页的平均大小接近 1MB(正如我在网上阅读的那样),我认为内存消耗的增加应该不是什么大问题。这似乎有道理吗?

标签: google-chrome-extension


【解决方案1】:

不同选项卡中的内容脚本也无法访问彼此的 JavaScript 对象。

Chrome 支持通过 chrome.runtime.sendMessage + .onMessage 在内容脚本和/或后台页面之间进行通信。因为所有消息都是 JSON 序列化的,所以 JavaScript 对象不能以这种方式“泄露”到其他上下文。

所以:不,您不能与其他选项卡(内容脚本中的)共享对象,例如 jQuery。

【讨论】:

    【解决方案2】:

    Execution environment of Content Scripts 确保内容脚本可以相互通信

    例如:

    "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["myscript.js","myscript1.js"]
        }
      ]
    }
    

    一个Individual DOM Environment,其中注入的内容脚本["myscript.js","myscript1.js"] 确保myscript1.js 可以访问myscript.js 的所有内容(函数、变量),但这从两个Individual DOM Environment 停止正在交流。

    话虽如此,您在Content Scripts 中看到的限制\要求要求message passing 需要background pages 访问DOM of injected pages 的要求?

    请详细说明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2015-06-21
      • 2018-08-26
      • 2012-07-29
      • 2011-09-28
      相关资源
      最近更新 更多