1

次のディレクトリ構造があるとします。

/web
    example.html
    example.js
/example.json

ブラウザで example.html を開くと、example.js が実行され、次の呼び出しを使用して example.json のデータを同期的にロードしようとします。

$.ajax({url: "file:///example.json",
        dataType: "json",
        async: false,
        success: function(data) {
            console.log(data)
        },
        error: function(request, status, error) {
            console.log(request);
            console.log(status);
            console.log(error);
        }
});

これにより、「制限付き URI へのアクセスが拒否されました」というメッセージとエラー コード 1012 のエラーが発生ます: 1012 . 最初のリンクでは、jQuery のgetJSONメソッドを使用するよう提案されていましたが、このメソッドは非同期でしか機能しません。2 番目のリンクは、ある種の JSONP コールバックを示唆していますが、これらがどのように機能するかを正確に理解することはできませんでした。

example.json を /web/example.json に移動すると、この問題は簡単に解決することに注意してください。ただし、実際の問題のいくつかの状況により、これを回避したいと考えています (ここで提示したのは、実際の問題を単純化したものです)。

編集: この JSONP コードを試していますが、まだ同じエラーが発生しています:

$.ajax({url: "file:///example.json",
    dataType: "jsonp",
    success: function(data) {
        console.log(data)
    },
    error: function(request, status, error) {
        console.log(request);
        console.log(status);
        console.log(error);
    }
});
4

3 に答える 3

0

デフォルトでは、クロスドメイン AJAX リクエストは許可されていません。CORSを使用する他のサーバーからの許可が必要です。または、JSONP を使用できます。

于 2013-07-25T14:52:18.807 に答える
0

同期 ajax を使用する理由は見当違いです。すべての ajax リクエストが完了するまで待ちたい場合は、次の方法を使用します。

var ajaxRequest1 = $.ajax();
var ajaxRequest2 = $.ajax();
var ajaxRequest3 = $.ajax();
$.when(ajaxRequest1, ajaxRequest2, ajaxRequest3).done(function(){});

これは、ループ内で一連の同期 ajax リクエストを実行するよりもはるかに効率的かつ高速です。

于 2013-07-25T15:00:25.157 に答える
0

クロスドメイン リクエストと dataType: "jsonp" リクエストは、同期操作をサポートしていません。

こちらのドキュメントをご覧ください。

于 2015-03-08T12:32:27.123 に答える