我目前正在我的内容脚本中使用jQuery的$ .getScript将更多Javascript文件导入我的内容脚本。这对我来说非常有效,可以导入我的所有Javascript文件,但我遇到了一个问题,我无法在导入的javascript文件中使用chrome.runtime.sendMessage与我的后台脚本进行通信,大概是因为函数不是'在$ .getScript处理的脚本中识别出来(如果我错了,请纠正我。)
在 content.js (直接通过清单文件注入)中,我有以下代码:
$.getScript(chrome.extension.getURL('js/angular-1.2.26-min.js'), function(data) {
$.getScript(chrome.extension.getURL('app/app.js'), function(data) {
$.getScript(chrome.extension.getURL('app/overview/overview-controller.js'), function(data) {
$.getScript(chrome.extension.getURL('js/angular-bootstrap.js'), function(data) {
})
})
})
})
在 app / app.js (或任何注入的文件)中,我尝试将sendMessage调用放在任何地方,但不会发送任何内容。 (我在后台记录onMessage事件监听器)
chrome.runtime.sendMessage({msg: 'test'}, function(response) { alert('done') })
注意:我也尝试通过向后台脚本发送消息来导入Javascript文件以使用chrome.tabs.executeScrip,但我需要能够仅在特定时间和特定时间注入javascript文件框架,所以这没有帮助。我也试过使用第三方executeScriptInFrame library,但这似乎也没有用。我在<{{URL}}'中遇到“阻止的脚本执行”,因为文档的框架是沙箱,而“allow-scripts”权限未设置为“
我的问题:
在使用$ .getScript注入的脚本中使用chrome.runtime.sendMessage是否有效?
有没有办法在内容脚本中使用executeScript?
是否有将内容脚本注入特定框架的有效方法?再次,从上面 - 我尝试了第三方库,但遇到了关于框架沙盒的问题。但这很奇怪,因为当使用清单直接执行时,我能够成功地将内容脚本注入该帧。
谢谢!
答案 0 :(得分:0)
嗯,这是一个有趣的问题。
大多数方法依赖于<script>
注入,这会将代码添加到无法访问Chrome API的错误(页面)上下文中。我认为这是$.getScript
的工作原理。所以,这不会按预期工作。
另一种方法是使用eval()
。根据{{3}},内容脚本中允许(但不鼓励)eval()
。因此,原则上,您可以在XHR / jQuery AJAX请求中加载脚本文件,然后eval()
其内容。 这应该可行。
最后,您可以修改内容脚本,只有在满足某些条件(例如,设置了变量)时执行,因此注入选项卡的所有帧应该不是问题。这可能会很麻烦。请注意,内容脚本可以the documentation,这可能很有用。