Chrome扩展:在内容脚本和后台脚本之间共享对象

8
我正在开发一个Chrome扩展程序,使用jQuery/Zepto在内容脚本中。现在,这个扩展程序是要在每个网站上运行的,这意味着每个用户打开的选项卡上都会加载一份jQuery/Zepto副本。
有没有办法在各个内容脚本之间共享jQuery/Zepto对象?
我知道内容脚本可以与后台脚本通信。我希望能够让后台脚本访问jQuery对象并将其引用返回给每个内容脚本。但我意识到只有JSON消息可以在内容和后台脚本之间传递。
有没有办法实现我想要的?

不可以在内容脚本之间共享直接的函数引用。(重复问题:如何在两个不同标签页的内容脚本之间传递数据?) - Rob W
将其作为答案发布,我会接受它。顺便问一下 - 我昨天想到,每个页面都包含jQuery实际上可能不是问题,因为与网页的实际资源不同,这不必下载。鉴于网页的平均大小接近1MB(据我在线阅读),内存消耗的增加应该不是什么大问题,我推理道。这听起来有道理吗? - Himanshu P
2个回答

9

不同标签页中的内容脚本也无法访问彼此的JavaScript对象。

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

所以:不,您不能与(其他标签页中的)内容脚本共享jQuery之类的对象。


1

执行环境内容脚本确保内容脚本之间可以相互通信。

示例:

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

在注入了["myscript.js","myscript1.js"]个人DOM环境中,确保myscript1.js可以访问myscript.js的所有内容(函数、变量),但这会阻止两个个人DOM环境之间的通信。
话虽如此,您认为内容脚本有哪些限制或要求需要消息传递需要后台页面来访问注入页面的DOM
请详细说明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接