2012-02-21 92 views
2

我正在尝试用jQuery 1.6.4和移动版来获取简单的json feed并将其显示为学习练习。我无法让getJSON中的回调触发。 json feed是公开的,所以没关系。这可能是一个jQuery 1.6.4 +移动的问题?jquery:Ajax Json简单渲染

$.getJSON('https://raw.github.com/currencybot/open-exchange-rates/master/latest.json', 
     function (data) { 
     var items = []; 

     $.each(data, function (key, val) { 
      items.push('<li id="' + key + '">' + val + '</li>'); 
     }); 

     $('<ul/>', { 
      'class': 'my-new-list', 
      html: items.join('') 
     }).appendTo('body'); 
    }); 

回答

3

您不能对此URL执行AJAX请求,因为它违反了相同的源策略。有关说明,请参阅http://e-mats.org/2010/01/jquery-getjson-and-the-same-origin-policy/。这里有一个报价:

当创建一个简单的混搭与数据从外部来源,你 平时想读在合适的格式的数据 - 如JSON。该工作的 工具往往是JavaScript,运行在您最喜欢的 浏览器中。唯一的问题是,使用XHR (XMLHttpRequest)进行的请求必须遵循相同的源策略,这意味着无法为生活在另一个主机上的资源请求 ,而不是为原始请求提供服务的主机。

为了避开这个客户端,通常使用JSONP--或者对通常的JSON输出进行简单的修改,即 。数据仍然是JSON,但 输出还包括在请求结束时的简单回调, 在本地浏览器中触发一个JavaScript。这样,数据的创建者实际上告诉浏览器(以这么多黑客的方式),它是 好吧,我已经想到了这一点。帮助你自己。

基本上,普通的AJAX使用XMLHtmlRequest,它具有相同的域安全策略。另一方面,JSONP插入一个脚本标记(没有同域源策略),它运行一个回调函数。但是终端服务器必须支持这个功能,因为它负责使用回调函数实际生成脚本。

如果服务器支持JSONP,则可以通过将callback=?添加到您使用getJSON调用的URL中的请求参数来执行此操作。但它看起来不像这个端点支持JSONP(增加callback=?什么都不做)。

因此,您可能必须在服务器上创建代理端点才能访问此数据。基本上,在你自己的服务器上创建一个端点,使用任何有意义的方法(curl等)加载该数据,并按原样返回它。然后,您可以使用常规AJAX调用您自己的服务器端点(同一服务器=不违反相同的原始策略)。