2015-01-13 42 views
1

我在Gmail用户界面中运行了一个内容脚本,我在不同的点注入了一些新的HTML。这一切都可行,但为了保持代码清洁,我希望在单个函数调用中将预定义的HTML标记插入页面的某些部分。Gmail Chrome扩展程序“chrome.extension”undefined

这一切似乎使用chrome.extension.getURL(),但是当我测试这个,它看起来像chrome.extension是未定义的!我无法在文档中的任何地方找到说明不应该定义的地方以及它应该说明的几个地方。

我使用的Chrome版本39.0.2171.95(64位)

这里是镀铬的对象看起来像在JavaScript控制台什么:

chrome object

首先,任何人都知道为什么铬.extension可能未定义?其次,是否有另一种(也许更好)的方式来做到这一点?我宁愿不要在内容脚本中以编程方式将大量的HTML注入到代码中使用jQuery等的页面中,但如果没有其他方式,可以使用此方法。

+0

您是否尝试在代码中执行'chrome.extension.getURL()'而不是测试控制台?或者是您的问题具体关于控制台? – Xan

+0

我没有 - chrome.extension.getURL()给出了这个:未捕获TypeError:无法读取未定义的属性'getURL' – BryanP

+0

在您的内容脚本代码?或者你是否注入了内容脚本中的其他代码? – Xan

回答

4

如果您正在控制台中测试此功能,则必须了解Isolated World的概念。当你添加一个内容脚本时,它有一个独立的JavaScript上下文,与页面隔离。

在开发工具的控制台选项卡顶部,您会在下拉菜单中看到<top frame>。这是一个选择正在执行的JS上下文的下拉列表。它将列出文档中的帧和所有内容脚本注入的扩展。

您在屏幕截图中显示的对象chrome对应于网页通常会看到的内容。如果上下文切换,你会看到不同的画面:

Switching context

在任何情况下,如果你真的在内容脚本执行chrome.extension.getURL() - 这将是很好的界定。


现在,如果你在页面中注入一个<script>标签,并尝试在代码 - 它会再次失败,因为代码将在页面上下文。有关这种情况,请参阅this question

最后,Chrome API的大部分都不会因安全原因暴露给内容脚本。如果an API is undefined when it shouldn't be,您可能需要一个背景页面为您完成这项工作。