内容脚本是在同一个孤立的世界中运行,还是在不同的孤立世界中运行?

时间:2015-03-29 18:48:14

标签: javascript jquery google-chrome google-chrome-extension

我正在阅读Chrome文档,试图了解如何创建扩展程序,并且正在努力了解如何在内容脚本之间共享数据。

假设我的扩展程序捆绑了三个脚本:

jquery.js
script1.js
script2.js

我需要script1.jsscript2.js来使用jQuery,每个脚本都需要能够读取和写入全局变量ala window.foo = 'bar'

脚本还向事件驱动的DOM添加内容,因此只要选项卡处于打开状态,它们读/写的全局变量就必须是持久的。

例如,script1.js可能会向页面添加一个按钮,单击该按钮会运行script1.js中定义的函数,该函数会设置全局变量,然后在script2.js中运行函数然后使用该变量(仅作为示例)。

The content script docs说:

  

但是,内容脚本有一些限制。他们不能:

     
      
  • ...
  •   
  • 使用其扩展程序页面定义的变量或函数
  •   
  • 使用由网页或其他内容脚本定义的变量或函数
  •   

这是否意味着扩展程序的内容脚本根本无法相互交互,或者是否说来自不同扩展程序的内容脚本无法相互交互?

换句话说,所有扩展内容脚本是在同一个孤立的世界中运行,还是在不同的孤立世界中运行?

1 个答案:

答案 0 :(得分:3)

每个扩展,每帧有一个执行上下文。

如果您在同一帧中注入多个脚本,它们将完全共享上下文(请参阅彼此的变量等)

DOM在所有上下文中共享。这样可以与custom events进行跨上下文通信。

跨框架(或交叉表)通信通常需要后台脚本作为消息的代理或类似window.postMessage的内容。