在Chrome中使用本地文件的jQuery getJSON问题

时间:2010-03-29 23:34:31

标签: ajax json jquery google-chrome

我有一个very simple test page使用jQuery的$ .getJSON和$ .ajax方法使用XHR请求。同一页面在某些情况下有效,而在其他情况下则无效。特别是,它在Ubuntu上的Chrome中不起作用。

我正在使用Chrome 5.0.342.7测试版测试Ubuntu 9.10,使用Chrome 5.0.307.9 beta测试Mac OSX 10.6.2。

  • 当从Ubuntu / Chrome和Mac / Chrome(try it out here)在Web服务器上安装文件时,它可以正常工作。
  • 当文件安装在Mac / Chrome的本地硬盘驱动器上时(使用file:/// ...访问),它可以正常工作。
  • 文件安装在Ubuntu / Chrome中的本地硬盘驱动器上 FAILS (使用file:/// ...访问)。

可以从这里下载tar / gzip文件中的一小组3个文件: http://issues.tauren.com/testjson/testjson.tgz

如果有效,Chrome控制台会说:

XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:16Using getJSON
index.html:21
Object
result: "success"
__proto__: Object
index.html:22success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:29Using ajax with json dataType
index.html:34
Object
result: "success"
__proto__: Object
index.html:35success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:46Using ajax with text dataType
index.html:51{"result":"success"}
index.html:52undefined

如果它不起作用,Chrome控制台将显示以下内容:

index.html:16Using getJSON
index.html:21null
index.html:22Uncaught TypeError: Cannot read property 'result' of null
index.html:29Using ajax with json dataType
index.html:34null
index.html:35Uncaught TypeError: Cannot read property 'result' of null
index.html:46Using ajax with text dataType
index.html:51
index.html:52undefined

请注意,尽管运行了成功处理程序,它甚至不会显示XHR请求。我发誓以前在Ubuntu / Chrome上工作过,我担心有些事搞砸了。我已经卸载并重新安装了Chrome,但这没有帮助。

有人可以在您的Ubuntu系统上本地试用,并告诉我您是否有任何问题?请注意,它似乎在Firefox中运行良好。

7 个答案:

答案 0 :(得分:38)

另一种方法是在目录上启动本地HTTP服务器。在安装了Python的Ubuntu和MacO上,它是一个单行的。

转到包含您的网络文件的目录,然后:

python -m SimpleHTTPServer

然后使用任何网络浏览器连接到http://localhost:8000/index.html以测试您的网页。

答案 1 :(得分:30)

这是Chrome的已知问题。

以下是错误跟踪器中的链接:

Issue 40787: Local files doesn't load with Ajax

答案 2 :(得分:13)

在Windows上,Chrome可能会安装在AppData文件夹中:

  

“C:\用户\\应用程序数据\本地\谷歌\铬\应用程序”

在执行命令之前,请确保所有Chrome窗口都已关闭,否则无法正常运行。或者,命令行参数无效。

chrome.exe --allow-file-access-from-files

答案 3 :(得分:3)

您可以将json放到js文件中并将其保存到全局变量中。它不是异步的,但可以提供帮助。

答案 4 :(得分:1)

@Mike在Mac上,在终端输入:

open -b com.google.chrome --args --disable-web-security

答案 5 :(得分:1)

解决此问题的另一种方法是利用Flash Player的Local Only安全沙箱和ExternalInterface方法。可以使用本地安全沙箱发布Flash应用程序的JavaScript请求,以从硬盘驱动器加载文件,Flash可以通过Flash的ExternalInterface类将数据传递回JavaScript。我已经在Chrome,FF和IE9中对此进行了测试,效果很好。如果有人有兴趣,我很乐意分享这些代码。

编辑:我已经开始实施Google代码(具有讽刺意味的?)项目:http://code.google.com/p/flash-loader/

答案 6 :(得分:1)

此代码与sheet.jsonlocally一起使用,浏览器同步作为本地服务器。 - 但是当我在远程服务器上时,我使用Chrome获得了一张404的sheet.json文件。 它在Safari和Firefox中运行良好。 - 将名称sheet.json更改为sheet.JSON。然后它在远程服务器上工作。 其他人有这种经历吗?

getthejason = function(){
var dataurl = 'data/sheet.JSON';
var xhr = new XMLHttpRequest();
xhr.open('GET', dataurl, true);
xhr.responseType = 'text';
xhr.send();
console.log('getthejason!');

xhr.onload = function() {
.....
}