我正在尝试向内容脚本中的页面注入脚本。
注入的脚本应该在abc
- 对象上定义一个对象window
。但是,在加载注入的脚本后,尝试从内容脚本中读取会导致window.abc = undefined
这可能是由于生活在isolated environments的内容脚本造成的吗?首先想到这看起来很奇怪,因为我希望从内容脚本动态注入的内容脚本和脚本生活在同一个环境中(从而共享同一个窗口对象)
背景:作为扩展的一部分,我需要在各种页面上加载内容脚本。即使可能不在该页面上使用扩展名,也必须为这些页面中的每一页加载大型脚本,这似乎完全浪费了带宽/性能。因此,我希望内容脚本尽可能轻量级,并且只有在用户表明他想在所述页面上使用扩展时才加载(延迟加载)较重的脚本(使用如上所述的注入)。 (通过点击某些事件,例如点击扩展图标)
答案 0 :(得分:0)
你的假设是正确的。文档中非常清楚地表明,您甚至将自己联系起来:
内容脚本在称为隔离的特殊环境中执行 世界。他们可以访问他们注入的页面的DOM, 但不是页面创建的任何JavaScript变量或函数。 它将每个内容脚本视为没有其他JavaScript 在正在运行的页面上执行。
直接在页面上运行的脚本使用页面的环境(窗口),即使您将其从内容脚本中注入页面也是如此。
调试提示
Chrome开发者工具控制台允许您在frame selection dropdown中切换页面上下文和内容脚本的上下文。您应该能够看到window.abc
已在页面(可能是top
)窗口中定义,但不会在内容脚本窗口中定义。
我不确定您的确切目标是什么,但如果您想在点击扩展程序图标后在页面上执行某些操作,则可以通过programmatic injection完成该操作。不需要事先在页面中注入任何东西。
进一步阅读SO:
Building a Chrome Extension - Inject code in a page using a Content script