在文件:protocol上发出json / jsonp xhr请求

时间:2011-01-04 00:42:04

标签: javascript html json xmlhttprequest file-uri

我正在编写一个将在file:协议上托管的javascript应用程序(即:应用程序只是一个html,css和javascript的文件夹,位于我的硬盘上的某个位置)。当我尝试正常的XHR请求时,由于相同的原始策略,它们会失败。

所以我的问题是,如上所述,使用应用程序请求json / jsonp文件的最佳方式是什么?

注意:到目前为止,我已经使用硬编码的回调函数获取了所有jsonp文件,但我希望能够为这些请求使用动态回调函数..有没有办法做到这一点?

3 个答案:

答案 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请求。