我正在编写一个将在file:
协议上托管的javascript应用程序(即:应用程序只是一个html,css和javascript的文件夹,位于我的硬盘上的某个位置)。当我尝试正常的XHR请求时,由于相同的原始策略,它们会失败。
所以我的问题是,如上所述,使用应用程序请求json / jsonp文件的最佳方式是什么?
注意:到目前为止,我已经使用硬编码的回调函数获取了所有jsonp文件,但我希望能够为这些请求使用动态回调函数..有没有办法做到这一点?
答案 0 :(得分:7)
这是一项苛刻的工作,但它会让你动态回调。基本上它依赖于file:
传输速度非常快的事实。它设置一个请求队列,并一次发送一个请求。这是我能够确定的唯一方法,以确保正确的响应和回调可以链接(保证顺序)。希望有人可以提出更好的方法,但是无法动态生成响应,这是我能做的最好的。
var JSONP = {
queue: [],
load: function(file, callback, scope) {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = "text/javascript";
script.src = file;
head.appendChild(script);
},
request: function(file, callback, scope) {
this.queue.push(arguments);
if (this.queue.length == 1) {
this.next();
}
},
response: function(json) {
var requestArgs = this.queue.shift();
var file = requestArgs[0];
var callback = requestArgs[1];
var scope = requestArgs[2] || this;
callback.call(scope, json, file);
this.next();
},
next: function() {
if (this.queue.length) {
var nextArgs = this.queue[0];
this.load.apply(this, nextArgs);
}
}
};
这就是我做的测试
window.onload = function() {
JSONP.request('data.js', function(json, file) { alert("1 " + json.message); });
JSONP.request('data.js', function(json, file) { alert("2 " + json.message); });
}
Data.js
JSONP.response({
message: 'hello'
});
答案 1 :(得分:1)
出于安全原因,Chrome对从file:// url进行ajax调用有非常严格的限制。他们知道它打破了本地运行的应用程序,并且a lot of debate有关于替代品的问题,但这就是今天的情况。
Ajax在Firefox中的文件URL工作正常,只要知道返回代码不是http状态代码;即,0表示成功,而不是200-299 + 304.
IE处理这些安全问题与Chrome和Firefox不同,我希望其他浏览器都有自己的方法。 Web和桌面应用程序之间的界限是非常棘手的问题。
答案 2 :(得分:-2)
"当我尝试正常的XHR请求时,由于相同的原始政策而导致他们失败"
...不,我认为它们失败是因为XHR请求使用HTTP或HTTP来请求Web服务器上的资源。 (见http://en.wikipedia.org/wiki/XMLHttpRequest)。
除非您与网络服务器联系,否则您无法(成功)发出XHR请求。