getJSON不会跨域提取数据

时间:2011-12-14 16:28:54

标签: jquery json

我试图跨域使用jQuery getJSON方法提取数据。我在这里设置了一个关于JS FIDDLE的测试:

http://jsfiddle.net/kbPV7/1/

我真的不知道为什么这不起作用。如果我在同一个域上传此文件或在本地使用feeTest.html,则代码可以正常工作。

但是,如果我上传或使用真正意图的网址,Feed就无法使用。

此外,如果我在相同的域中使用.ajax,它的工作原理。但我的理解是.ajax不能跨不同的域工作,这就是.getJSON的用途。

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

$.getJSON无法解析same origin policy restriction,但JSONP会解析{{3}}。但是,这要求服务器发送回包装json数据的回调。

答案 1 :(得分:0)

.getJSON()是具有预配置选项的.ajax()的简写。请参阅documentation

URL中的数据采用JSON格式,跨域不支持。它们需要以JSONP格式返回,这意味着它们必须能够将数据放入指定的回调函数中。

您必须修改服务以使用JSONP并允许您指定回调参数或使用其他方式来访问服务。

使用YQL访问您的数据的示例:

$.ajax({
  url: 'http://query.yahooapis.com/v1/public/yql',
  data: { 
    q: 'select * from json where url="http://www.corporatereport.com/SampleSites/rockwellCollins/mockup5/feedTest.html"',
    format: 'json'
  },
  dataType: 'JSONP',
  success: function(data) {
    // this is the XML in JSON format
    console.log(data.query.results.json.news);

    // example - display list of titles
    var titles = $.map(data.query.results.json.news, function(news) {
      return '<li>' + news.t + '</li>';
    });
    $('<ul />', { html: titles.join('') }).appendTo('body');
  }
});

HERE 是代码。

答案 2 :(得分:0)

在这种情况下,您可以访问两个可以控制的不同域,并且您必须进行跨域调用。所以,这种情况是你无法避免它,你无法控制以JSONP格式返回数据。

var script = document.createElement('script');
script.type = "text/javascript";        
script.src='path to crossdomain source.js';
document.getElementsByTagName("head")[0].appendChild(script);

lookupInterval = setInterval("function_to_call()", 1000);

var lookupCounter=0;

function function_to_call(){
    //give up after 5 times
    if(++lookupCounter == 5)
        return clearInterval(lookupInterval);

    try{
        var cities = GEO_DATA_2011_11_28.cities.city;

        //since we found our data, let's clean the interval call
        return clearInterval(lookupInterval)
    }
    catch(e){
        //do nothing, we are actually controlling the situation with the if condition at the beginning
    }
}

我们将远程js文件中的数据定义为JSON格式的var GEO_DATA_2011_11_28 = {}。这里的技巧是我们动态地将脚本文件注入HTML的头部。由于脚本块可以毫无问题地加载跨域脚本,因此我们可以以延迟方式执行此操作。考虑到加载脚本可能会有延迟,我们正在调用一个函数来检查我们想要获取的数据。

此解决方案是必要的,因为无法在JSONP中发送数据,因此我们依赖于读取简单的js文件。

答案 3 :(得分:0)

HY, 这违反了相同的原产地政策,通常是不允许的。
无论如何,有一个使用Yahoo Query Language YQL的jQuery插件。到目前为止,我在我的项目中使用它并且工作正常。
这是教程http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

的链接