【问题标题】:Gmail Chrome Extension "chrome.extension" undefinedGmail Chrome 扩展程序“chrome.extension”未定义
【发布时间】:2015-01-13 00:21:45
【问题描述】:

我在 Gmail UI 中运行了一个内容脚本,并且我在不同的点注入了一些新的 HTML。这一切正常,但为了保持代码干净,我想在单个函数调用中将预定义的 HTML 标记插入页面的某些部分。

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

我使用的是 chrome 版本 39.0.2171.95(64 位)

下面是 chrome 对象在 javascript 控制台中的样子:

首先,有人知道为什么 chrome.extension 可能未定义吗?其次,是否有另一种(也许更好)的方法来做到这一点?我宁愿不只是在内容脚本中使用 jQuery 等在代码中以编程方式将大量 HTML 注入页面,而是在没有其他方法的情况下可以诉诸于此。

【问题讨论】:

  • 您是否尝试在代码中实际执行chrome.extension.getURL() 而不是测试控制台?还是您的问题是关于控制台的?
  • 我做了 - chrome.extension.getURL() 给出了这个:Uncaught TypeError: Cannot read property 'getURL' of undefined
  • 在您的内容脚本代码中?还是您从内容脚本中注入了一些其他代码?
  • 这是在我的内容脚本 JS 中调用的
  • 你是对的 - 我假设(错误地)因为我从清单中定义的“内容脚本”下的脚本中注入了另一个脚本,它也是一个“内容脚本”并且具有相同的chrome 对象中的属性。感谢您的提醒!

标签: javascript html google-chrome google-chrome-extension


【解决方案1】:

如果您在控制台中对此进行测试,您必须了解Isolated World 的概念。当您添加内容脚本时,它有一个独立于页面的独立 JavaScript 上下文。

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

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

无论如何,如果你真的在内容脚本中执行chrome.extension.getURL() - 它会被很好地定义。


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

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

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2013-01-17
    • 1970-01-01
    • 2011-09-12
    • 2014-06-04
    相关资源
    最近更新 更多