3

プロトコルでホストされる JavaScript アプリを作成していfile:ます (つまり、アプリケーションは、ハード ドライブのどこかにある html、css、および JavaScript のフォルダーです)。通常の XHR リクエストを試すと、同じオリジン ポリシーが原因で失敗します。

私の質問はこれです。上記のように、アプリで json/jsonp ファイルを要求する最良の方法は何ですか?

注: これまでのところ、ハードコーディングされたコールバック関数を使用してすべての jsonp ファイルを取得していますが、これらの要求に対して動的なコールバック関数を使用できるようにしたいと考えています.これを行う方法はありますか?

4

2 に答える 2

7

これは手斧のようなものですが、動的なコールバックを取得できます。file:基本的には、転送がかなり高速になるという事実に依存しています。リクエストのキューを設定し、一度に 1 つずつ送信します。これが、正しい応答とコールバックを (保証された順序で) リンクできることを確認する唯一の方法でした。うまくいけば、誰かがより良い方法を考え出すことができますが、応答を動的に生成することができないため、これが私ができる最善の方法です.

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'
});
于 2011-01-04T13:28:36.473 に答える
1

Chrome では、セキュリティ上の理由から、file:// URL から ajax 呼び出しを行うことに対して非常に厳しい制限があります。彼らは、ローカルで実行されるアプリが壊れることを知っており、代替案について多くの議論がありましたが、それが今日の現状です.

Ajax は Firefox のファイル URL から正常に動作しますが、戻りコードが http ステータス コードではないことに注意してください。つまり、200-299 + 304 ではなく、0 が成功です。

IE は、Chrome や Firefox とは異なる方法でこれらのセキュリティ問題を処理します。他のブラウザーにはそれぞれ独自のアプローチがあると思います。Web アプリとデスクトップ アプリの境界は、非常に問題のある領域です。

于 2011-06-17T14:53:25.030 に答える