Javascript 对文件:protocol发出json/JSONPxHR请求
我正在编写一个javascript应用程序,它将托管在Javascript 对文件:protocol发出json/JSONPxHR请求,javascript,html,json,xmlhttprequest,file-uri,Javascript,Html,Json,Xmlhttprequest,File Uri,我正在编写一个javascript应用程序,它将托管在文件:协议上(即:该应用程序只是一个html、css和javascript文件夹,位于硬盘上的某个位置)。当我尝试正常的XHR请求时,由于afaict的同源策略,它们会失败 所以我的问题是,如上所述,使用应用程序请求json/jsonp文件的最佳方式是什么 注意:到目前为止,我的所有jsonp文件都使用了硬编码回调函数,但我希望能够对这些请求使用动态回调函数。。有什么方法可以做到这一点吗?这是一种恶作剧式的工作,但它会让您获得动态回调。基本上
文件:
协议上(即:该应用程序只是一个html、css和javascript文件夹,位于硬盘上的某个位置)。当我尝试正常的XHR请求时,由于afaict的同源策略,它们会失败
所以我的问题是,如上所述,使用应用程序请求json/jsonp文件的最佳方式是什么
注意:到目前为止,我的所有jsonp文件都使用了硬编码回调函数,但我希望能够对这些请求使用动态回调函数。。有什么方法可以做到这一点吗?这是一种恶作剧式的工作,但它会让您获得动态回调。基本上,它依赖于
文件:
传输速度非常快这一事实。它设置一个请求队列,并一次发送一个请求。这是确保正确的响应和回调可以链接(以保证的顺序)的唯一方法。希望有人能想出一个更好的方法,但如果不能动态生成响应,这是我能做的最好的了
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'
});
出于安全原因,Chrome对从文件://url进行ajax调用有非常严格的限制。他们知道这会破坏本地运行的应用程序,而且有很多替代方案,但这就是今天的情况 Ajax在Firefox中的文件URL中工作良好,只是要注意返回代码不是http状态代码;i、 例如,0代表成功,而不是200-299+304
IE处理这些安全问题的方式不同于Chrome和Firefox,我希望其他浏览器都有自己的方法。网络应用和桌面应用之间的界限是一个非常有问题的领域。@Erik我没有这样的假设。在发送下一个请求之前,我实际上正在等待返回。相反,我假设请求会很快。但是,顺序不是问题。@Erik。。。我想我也假设不会有错误;)这是一个不错的解决方案,虽然我希望看到一个不需要排队请求的解决方案,但在使用
文件:
时,正如您所说,这并不是那么糟糕。我喜欢您的解决方案!它不是XHR请求;但它似乎符合OP的要求。您有任何浏览器要求吗?它应该在尽可能多的浏览器上工作。对于CORS,它永远不会工作,因为您无法通过请求文件:
主机来返回访问控制允许源站
标题。