在导入的javascript文件中使用chrome.runtime.sendMessage

时间:2014-10-27 21:40:03

标签: google-chrome-extension

我目前正在我的内容脚本中使用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?

  • 是否有将内容脚本注入特定框架的有效方法?再次,从上面 - 我尝试了第三方库,但遇到了关于框架沙盒的问题。但这很奇怪,因为当使用清单直接执行时,我能够成功地将内容脚本注入该帧。

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,这是一个有趣的问题。

大多数方法依赖于<script>注入,这会将代码添加到无法访问Chrome API的错误(页面)上下文中。我认为这是$.getScript的工作原理。所以,这不会按预期工作。

另一种方法是使用eval()。根据{{​​3}},内容脚本中允许(但不鼓励)eval()。因此,原则上,您可以在XHR / jQuery AJAX请求中加载脚本文件,然后eval()其内容。 这应该可行。

最后,您可以修改内容脚本,只有在满足某些条件(例如,设置了变量)时执行,因此注入选项卡的所有帧应该不是问题。这可能会很麻烦。请注意,内容脚本可以the documentation,这可能很有用。