我试图创建一个网站,可以下载并通过启动其索引文件在本地运行。

所有文件都是本地的,没有在线使用资源。

当我尝试使用jQuery的AJAXSLT插件来处理带有XSL模板的XML文件(在子目录中)时,我收到以下错误:

XMLHttpRequest无法加载文件:///C:/path/到/XSL%20Website/data/home.xml。Access-Control-Allow-Origin不允许原点为空。

XMLHttpRequest无法加载文件:///C:/path/到/XSL%20Website/assets/ XSL /main.xsl。Access-Control-Allow-Origin不允许原点为空。

提出请求的索引文件是file:///C:/path/to/XSL%20Website/index.html,而使用的JavaScript文件存储在file:///C:/path/to/XSL%20Website/assets/js/。

我该如何解决这个问题?


当前回答

您可以尝试输入'Access-Control-Allow-Origin':'*'作为响应。writeHead({[这]})。

其他回答

下面是一个applescript,它将开启——allow-file-access-from-files开关,用于OSX/Chrome开发者:

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"    
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

您可以尝试输入'Access-Control-Allow-Origin':'*'作为响应。writeHead({[这]})。

从本质上讲,处理这个问题的唯一方法是在本地主机上运行一个web服务器,并从那里为它们提供服务。

对于浏览器来说,允许ajax请求访问您计算机上的任何文件是不安全的,因此大多数浏览器似乎将“file://”请求视为没有同源策略的目的。

启动一个web服务器就像输入文件所在的目录并运行一样简单:

python -m http.server

[编辑感谢@alextercete,指出它已在Python3中更新]

这个解决方案将允许您使用jQuery.getScript()加载本地脚本。这是一个全局设置,但您也可以在每个请求的基础上设置crossDomain选项。

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});

我解决这个问题的方法是完全不使用XMLHTTPRequest,而是将所需的数据包含在单独的javascript文件中。(在我的情况下,我需要一个二进制SQLite blob使用https://github.com/kripken/sql.js/)

我创建了一个名为base64_data.js的文件(并使用btoa()来转换我需要的数据,并将其插入到<div>中,以便我可以复制它)。

var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";

然后像普通javascript一样将数据包含在HTML中:

<div id="test"></div>

<script src="base64_data.js"></script>
<script>
    data = atob(base64_data);
    var sqldb = new SQL.Database(data);
    // Database test code from the sql.js project
    var test = sqldb.exec("SELECT * FROM Genre");
    document.getElementById("test").textContent = JSON.stringify(test);
</script>

我想修改它来读取JSON,甚至XML是很简单的;我把这个留给读者做练习吧;)