2

$.ajaxjqueryまたはを使用して別のサーバーからファイルを取得しようとしています$.getJSONが、壁にぶつかっていてaccess-control-allow-origin、jsonp オプションが機能していないようです。

このサイトは jQuery 1.5.1 を使用しています。

ここに私の3つのテストがあります:

基本的な $.ajax を使用すると、要求された URL は?callback=?追加されません。

$.ajax({
    url: url,
    datatype: 'jsonp',
    error: function(){console.log('error');},
    success: function(){console.log('success');}
});

ハッキングの試みで基本的な $.ajax を使用すると、クロスサイトの問題が発生します。

$.ajax({
    url: url + '.jsonp?callback=?',
    datatype: 'jsonp',
    error: function(){console.log('error');},
    success: function(){console.log('success');}
});

$.getJSON を使用すると、クロスサイトの問題は回避されますが、エラー ケースは発生しません。

$.getJSON(url + '?callback=?',
    function(data){
        console.log('success');
    })
    .error(function(){
        console.log('error');
    })
    .success(function(){
        console.log('success!');
    });

誰かが私が間違っていることを見ていますか? 最後に、URL が存在するかどうかをテストし、存在しない場合はエラーで何かをしようとしています。

編集: アクセスしようとしている URL は存在しません。エラーケースがトリガーされることを期待しています。

4

4 に答える 4

3

javascript から外部リソースにアクセスできるようにするため。リモート リソースはaccess-control-allow-origin、応答ヘッダーに含める必要があります。そのリソースを制御できる場合は、この応答ヘッダーを*(より制限されたアクセス制御が必要な場合はドメイン) に追加する必要があります。

詳細については、こちらをご覧ください: http://enable-cors.org/

その外部リソースを制御しない場合。解決策はよりトリッキーです。YUI を使用してクロスドメインの ajax 呼び出しを行う人もいます。こちらをご覧ください: http://jpvalappil.wordpress.com/2010/01/04/cross-domain-ajax-the-yui-way/ .

chrome-extension を作成している場合、API を使用すると、js から他のドメインのリソースにアクセスする権限を拡張機能に付与できます。

于 2012-07-01T12:33:49.673 に答える
1

jQuery-JSONPを使用できます。このスクリプトを使用すると、エラーをキャッチできます (ただし、意味のあるエラー メッセージは表示されません)。

   $.jsonp({
      "url": "http://gdata.youtube.com/feeds/api/users/"+userId+"?callback=?",
      "data": {
          "alt": "json-in-script"
      },
      "success": function(userProfile) {
          // handle user profile here 
      },
      "error": function(d,msg) {
          alert("Could not find user "+userId);
      }
    });

主要なブラウザでサポートされています:

  • Internet Explorer 6 以降
  • Firefox 2+
  • クロム 1+
  • サファリ 3+
  • オペラ 9+
于 2012-07-16T04:53:33.260 に答える
0

タイムアウトを指定する必要があります:

$.ajax({
    dataType: "jsonp",
    url : url,
    timeout : 1000
})
    .done(function(data) {logdata(data); })
    .fail(function() { logdata("error"); });
于 2012-07-01T12:48:13.553 に答える
0

datatype を使用しましたが、dataType を使用する必要があります。

于 2017-02-19T19:18:42.647 に答える