Javascript 对文件:protocol发出json/JSONPxHR请求

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文件都使用了硬编码回调函数,但我希望能够对这些请求使用动态回调函数。。有什么方法可以做到这一点吗?这是一种恶作剧式的工作,但它会让您获得动态回调。基本上

我正在编写一个javascript应用程序,它将托管在
文件:
协议上(即:该应用程序只是一个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,它永远不会工作,因为您无法通过请求
文件:
主机来返回
访问控制允许源站
标题。