7

このJavaScriptを検討してください:

$.ajax({
    url:'http://ichart.finance.yahoo.com/table.csv?s=GS&a=00&b=1&c=2010&d=08&e=3&f=2012&g=d&ignore=.csv',
    type:'get',
    dataType:'jsonp',
    success:function(data){
        alert(data);
    }
})

URLは.csvファイルを返しますが、jsonpこれはクロスドメインajaxリクエストであるため、データ型を指定しています。そのパラメータがないと、「原点は許可されていません」というエラーが発生します。

データ型を指定しているjsonpので、.csvファイルがJSON形式ではないため、ajax関数はエラーをスローします。しかし、開発コンソールでは、ブラウザーがコヒーレントな.csvファイルを受信して​​いることがわかります。したがって、CSVファイルを正常に受信していることがわかります。可能だと思いますが、このcsvファイルをajax関数に正しく受信する方法がわかりませんか?

もちろん、このURLに正しい形式のJSON文字列を返すようにできれば、それが最適ですが、それができるかどうかはわかりません。

これが試してみることができるフィドルです。そのエラーを確認するには、開発コンソールを開く必要があります:http: //jsfiddle.net/92uJ4/3/

どんな助けでも大歓迎です。

ティム

4

2 に答える 2

8

残念ながら、クロスドメインの制限は、これが機能しないことを意味します。このシステムは、AJAXで任意のクロスドメインコンテンツをプルできないように特別に構築されています。取得している非JSONPデータを実際のJSONPデータに変換するための事前解析方法はありません(制限のポイントを無効にするため)。

Yahoo!からデータを取得するローカルサーバーを呼び出す必要があります。それをAJAXリクエストに送信するか、任意のURLから取得してデータをJSONPとして返す何らかのサービスを見つけます。たまたま、Yahoo!まさにそのようなサービスを提供します:YQL(Yahooクエリ言語)。詳細については、このリンクを参照してください。

目的を達成するには、次のフィドルのコードを使用します:http: //jsfiddle.net/c5TeM/1/

function get_url(remote_url) {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?"+
"q=select%20*%20from%20html%20where%20url%3D%22"+
encodeURIComponent(remote_url)+
"%22&format=json",
        type: 'get',
        dataType: 'jsonp',
        success: function(data) {
            alert(data.query.results.body.p);
        },
        error: function(jqXHR, textStatus, errorThrow){
            alert(jqXHR['responseText']);
        }
    })
}
于 2012-09-03T16:44:13.367 に答える
0

最後に提供された jsfiddle を変更すると、次の解決策にたどり着きました:
http://jsfiddle.net/9zcsxq5a/

var str_parse = function(data){
  data = data.replace(/<[/]*body[^>]*>/g,'');
  data = data.replace(/<--[\S\s]*?-->/g,'');
  data = data.replace(/[\r]+/g,'');
  data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,'');
  data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,'');
  data = data.replace(/<script.*\/>/,'');
  return data
}

get_url = function(URL){
  $.ajax({
    url:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"+
    encodeURIComponent(URL)+"%22",
    dataType: "jsonp",
    type: 'get',
    success: function(r){
      data=r.results[0];
      data = str_parse(data);
      data = data.split(/[\n]+/);
    
    //// first line of the csv holds the colnames
      var HEADER = data[0].split(",");
      data.shift();
      
    /// create { OBJECT } structure for each row
        data = (function(){
        var o=[]; 
        data.forEach(function(E){
            o.push( (function(){ 
            var _o={}; 
            for( var i=0, s=E.split(",");i<s.length;i++ ) 
              _o[HEADER[i]]=s[i];
            return _o;
          }()) );
        });
        return o;
      }());
      
    /// THE FINAL OBJECT 
      console.log(data);
      return data;
    }
  }); 
}

$('#a').click(function() {
    get_url("http://ichart.finance.yahoo.com/table.csv?a=8&b=11&e=10&g=d&c=2005&d=2&f=2016&s=YHOO");
});

csv は、asis を介して渡され、次に変更されて json オブジェクトになります。

http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.historicaldata%20where%20symbol%20in%20%28%27YHOO%27%29%20and% 20startDate%20=%20%272009-09-11%27%20and%20endDate%20=%20%272010-03-10%27&diagnostics=true&env=store://datatables.org/alltableswithkeys

于 2016-07-02T19:53:29.433 に答える