5

我正在尝试加载使用 Backbone 构建的 Web 应用程序,它会提取本地存储的 JSON 和 HTML 模板文件。我想知道 Chrome 打包应用程序是否可以通过使用某种“get”/ajax 请求来加载这些文件?

目前我得到这个...

OPTIONS chrome-extension://fibpcbellfjkmapljkjdlpgencmekhco/templates/templates.html Cannot make any requests from null. jquery.min.js:2
XMLHttpRequest cannot load chrome-extension://fibpcbellfjkmapljkjdlpgencmekhco/templates/templates.html. Cannot make any requests from null.

我找不到任何关于如何做到这一点的真实信息,所以任何帮助都会非常感谢!

4

3 回答 3

6

是的,这是完全可能的,而且很容易。这是一个工作示例。尝试从这个开始,确认它有效,然后添加回您自己的代码。如果您遇到障碍并提出一个比 XHR 是否适用于打包应用程序更具体的问题,您可能想问一个新问题。

清单.json:

{
  "name": "SO 15977151 for EggCup",
  "description": "Demonstrates local XHR",
  "manifest_version" : 2,
  "version" : "0.1",
  "app" : {
    "background" : {
      "scripts" : ["background.js"]
    }
  },
  "permissions" : []
}

背景.js:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create("window.html",
    { bounds: { width: 600, height: 400 }});
});

窗口.html:

<html>
<body>
  <div>The content is "<span id="content"/>"</div>
  <script src="main.js"></script>
</body>
</html>

主.js:

function requestListener() {
  document.querySelector("#content").innerHTML = this.responseText;
};

onload = function() {
  var request = new XMLHttpRequest();
  request.onload = requestListener;
  request.open("GET", "content.txt", true);
  request.send();
};

内容.txt:

Hello, world!
于 2013-04-13T03:31:52.633 回答
2

您正在从沙盒页面发出请求,而沙盒页面的来源为空。

我已经在 Google Group 上发布了这个问题。

除非 Chrome 决定更改沙盒策略,否则似乎唯一的解决方法是从非沙盒页面发出 XHR 请求,并使用 Chrome 的消息传递 API 将其提供给您的沙盒页面。

我不知道为什么它必须如此困难。

编辑:

Chrome 团队的回答是将 CORS 标头更改为 *.

于 2013-06-08T05:10:00.227 回答
0

我相信您的问题出在服务器端,而不是客户端。服务器需要为 jQuery 发送以下标头来处理响应:

Access-Control-Allow-Origin: *

然而,问题在于任何页面现在都可以加载该内容。知道扩展程序的 ID 后,您可以将该标头更改为:

Access-Control-Allow-Origin: chrome-extension://gmelhokjkebpmoejhcelmnopijabmobf/

对以下内容的简短测试表明这些是有效的:

<h1>Content Below</h1>
<div id="loadme"></div>
<script src="jquery-1.9.1.min.js"></script>
<script src="app.js"></script>

// app.js
$(document).ready(function() {
  $.get('http://localhost:8080/content.php', function(data) {
    $('#loadme').html(data);
  });
});

如果我没有添加Access-Control-Allow-Origin标题,这将失败并显示以下消息:

XMLHttpRequest cannot load http://localhost:8080/newhope/deleteme.php.
Origin chrome-extension://gmelhokjkebpmoejhcelgkfeijabmobf is not allowed by
Access-Control-Allow-Origin. 

一旦我Access-Control-Allow-Origin在 php 响应中添加了标头,它就可以正常工作了。

同样,将其设置为*可能存在安全风险,因为任何地方的任何浏览器页面都允许内联加载它。

于 2013-04-13T12:39:18.367 回答