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

Do content scripts run in the same isolated world, or in separate isolated worlds?

本文关键字:世界 运行 脚本 同一个      更新时间:2023-09-26

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

假设我有三个脚本与我的扩展捆绑在一起:

jquery.js
script1.js
script2.js

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

脚本还将内容添加到事件驱动的DOM中,因此只要选项卡打开,它们读取/写入的全局变量就需要是持久的。

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

内容脚本文档说:

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

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

这是否意味着扩展的内容脚本根本不能相互交互,或者是说不同扩展的内容剧本不能相互交互?

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

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

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

DOM在所有上下文中共享。这实现了与自定义事件的跨上下文通信。

跨帧(或跨标签)通信通常需要一个后台脚本作为消息或类似window.postMessage的代理。