8

サーバーはリクエストURLのパラメータを受け入れないため、URLの余分なパラメータをすべて削除する必要があります。もちろん、サーバーを制御することはできません。

jQuery:

$.ajax({
    type: 'GET',
    url: 'http://cross-domain.com/the_jsonp_file,
    jsonpCallback: 'jsonCallback',
    contentType: 'application/json',
    cache: 'true',
    dataType: 'jsonp',
    success: function(json) {
        console.log(json);
    },
});

JSONPファイル:

jsonCallback({"test": "hello"});

そのAjaxリクエストを送信すると、URLは次のようになります。

http://cross-domain.com/the_jsonp_file?callback=jsonCallback

しかし、私はこれが必要です(パラメーターなしで):

http://cross-domain.com/the_jsonp_file

編集:

これが私の全体的な状況です:

function MyClass(imgs) {
    // imgs is array of URLs
    this.imgs = imgs;

    this.submit = function() {
        // button click event triggers this method
        this._show();
    };

    this._show = function() {
        var _this = this;

        for (var i = 0; i < _this.imgs.length; i++) {
            (function($, j) {
                $.ajax({
                    type: 'GET',
                    url: _this.imgs[j],
                    jsonp : false,
                    jsonpCallback: 'jsonCallback',
                    cache: 'true',
                    dataType:'jsonp',
                    success: function(json) {
                      console.log(_this.imgs[j]);
                    },
                });
            })(jQuery, i);
        };
    };
};

そして、私はこのエラーメッセージを受け取りました:

Uncaught TypeError: Property 'jsonCallback' of object [object Window] is not a function

奇妙なことに、jsonCallbackを正常に呼び出しているリクエストはほとんどありません。

4

3 に答える 3

11

jQuery ドキュメントを確認してください - 彼らは jsonp: false と jsonpCallback : 'callbackFunction' を ajax args で言うと言います....のように:

$.ajax({
    url: 'http://cross-domain.com/the_jsonp_file',
    jsonp : false,
    jsonpCallback: 'jsonCallback',
    // contentType: 'application/json', -- you can't set content type for a <script> tag, this option does nothing for jsonp | KevinB
    cache: 'true',
    dataType : 'jsonp'
});

http://api.jquery.com/jQuery.ajax/

于 2012-10-12T17:28:18.600 に答える
1

すべてのリクエストが同じ callback を呼び出すjsonCallbackので、それが問題だと思いました。

まず、ドキュメント内の Javascript:

<script type="text/javascript">
    new Gallery([
        ['http://cross-domain.url/whatever', '27b2afa5c77c2510'],
        ['http://cross-domain.url/whatever', '13df51b2f2801bc1'],
        ['http://cross-domain.url/whatever', '4de326fc9a2c5a24'],
        ['http://cross-domain.url/whatever', '60c266a73ba699bc'],
        ['http://cross-domain.url/whatever', '3db01e95aaf2b9f2'],
        ['http://cross-domain.url/whatever', '94eb17f9b0e1be9c'],
        ['http://cross-domain.url/whatever', 'ca8c5c3c0b8cd5ae'],
        ['http://cross-domain.url/whatever', '6b0f5c5737ee88fd'],
        ['http://cross-domain.url/whatever', '318d8ebb51a97a15'],
        ['http://cross-domain.url/whatever', 'f5028c8b62e81a8b'],
    ]);
</script>

クライアントは、次のように JSONP ファイル (別の Javascript ファイル) をサーバーにアップロードします。

jsonCallback_27b2afa5c77c2510({"test": "hello"});

jsonCallback_jQuery のデフォルト コールバックのように、各リクエストを分離するためにランダムな 16 進文字列を追加しました。

入力からランダムな 16 進文字列を読み取り、次のように設定しjsonpCallbackます。

function Gallery(imgs) {
    // imgs is array of URLs
    this.imgs = imgs;

    this.submit = function() {
        // button click event triggers this method
        this._show();
    };

    this._show = function() {
        var _this = this;

        for (var i = 0; i < _this.imgs.length; i++) {
            (function($, j) {
                $.ajax({
                    type: 'GET',
                    url: _this.imgs[j][0],
                    jsonp : false,
                    jsonpCallback: 'jsonCallback_' + _this.imgs[j][1],
                    cache: 'true',
                    dataType:'jsonp',
                    success: function(json) {
                      // Process
                      console.log(json.test);
                    },
                });
            })(jQuery, i);
        };
    };
};

ありがとう@Adam @Kevin B @Dcullenとみんな!:D

ps: 上記のすべてのソースを例として入力しましたが、正しくない可能性があります。

于 2012-10-12T19:24:37.140 に答える
0

JSONP では、URL の一部としてコールバックが必要です。アクセスしているサーバーがJSONPをサポートしていないという説明に基づいて推測します。

jQuery はドキュメントにスクリプト タグを追加します。このタグが追加されると、API リクエストが実行され、応答によってコード内のコールバック関数が呼び出されます (これにより単純化されます)。

より正確な説明が必要な場合は、ウィキペディアを参照してください。 http://en.wikipedia.org/wiki/JSONP#How_it_works

于 2012-10-12T17:42:55.343 に答える