【问题标题】:XMLHttpRequest for chrome-extension protocol用于 chrome 扩展协议的 XMLHttpRequest
【发布时间】:2025-11-27 18:30:01
【问题描述】:

我正在使用后台页面,我需要在当前选项卡内容中注入一些代码。

所以我做了以下事情:

  • 定义 browser_action
  • 像这样定义监听器chrome.browserAction.onClicked.addListener
  • 通过chrome.tabs.executeScript调用content_scripts加载的脚本

从页面内容我需要从扩展文件夹中加载 html 资源。

但是使用这个 XMLHttpRequest 会给我错误Cross origin requests are only supported for HTTP

由 XMLHttpRequest 处理,错误 NETWORK_ERR: XMLHttpRequest Exception 101

那我该怎么解决呢?

注意:地址类似于chrome-extension://someextensionid/file.html

【问题讨论】:

  • 也许您可以向后台页面发送请求,后台页面将执行实际的数据获取。然后后台页面将此数据发送到内容脚本。
  • 以及如何通过executeScript 发送 DOMDocument 类型的变量?
  • 我认为“加载 html 资源”是指 HTML 源代码,它只是一个字符串。如果您指的是 HTML 中的外部文件,那么它可能会变得很棘手。
  • 是的,我正在尝试加载 HTML 文件并通过 appendChild 将其添加到 document.body
  • 将源(字符串)发送到内容脚本,然后你可以在那里解析它,例如jQuery,并将某些元素附加到正文。

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


【解决方案1】:

解决方法:

btoa(loadXHR(chrome.extension.getURL('file.html')))

在哪里

  • btoa = 字符串到 base64
  • loadXHR = 同步 xm​​lhttprequest
  • chrome.extension.getURL = 解析扩展文件夹中的地址

这是在 background_page 中完成的,并使用

传递给前台脚本
chrome.tabs.executeScript

在前台,脚本将字符串转换为 html-string 和 dom 对象

var div = document.createElement('div');
div.innerHTML = atob(tbr);
document.body.appendChild(div);

在哪里

  • document.createElement = 创建新的“”元素
  • innerHTML = div 元素的 HTML 值,因此设置它会创建 DOM 可解析内容
  • atob = base64 字符串到解码版本
  • document.appendChild = 将带有 HTML 内容的 div 附加到 body 元素

【讨论】:

    【解决方案2】:

    代替:

    btoa(loadXHR(chrome.extension.getURL('file.html')))
    

    你应该可以使用:

    loadXHR('file.html')
    

    XMLHttpRequest 理解相对路径(根目录是您的扩展文件夹)。

    【讨论】:

    • 是的,你是对的。但就我而言,并非我需要获取的每个文件都与背景页面放在同一个文件夹中
    • @Marek 没关系,/ 是你的扩展文件夹,如果你喜欢可以使用/dir1/dir2/file.htmlchrome.extension.getURL 仅对内容脚本有用,在后台页面内,您可以在任何地方使用相对路径。
    • 在内容脚本中不能使用 chrome.extension.getURL,不是吗?
    • @Marek 你可以,这几乎是唯一需要它的地方。