jQuery.getJSON()| jqueryAPI 2.2 中文手册- AspRain.cn 致力于Web开发技术翻译整理

jQuery API 2.2.0

jQuery.getJSON()

分类:Ajax > 简写方法

返回: jqXHR

jQuery.getJSON( url [, data ] [, success ] )

描述:使用一个HTTP GET请求,从服务器上载入JSON编码的数据。

加入于: 1.0
jQuery.getJSON( url [, data ] [, success ] )
  • url
    类型:String
    一个字符串,它包含了发送请求的URL。
  • data
    类型:PlainObject or String
    一个纯对象或字符串,将和请求一起发送到服务器。
  • success
    类型:FunctionPlainObject data, String textStatus, jqXHR jqXHR )
    一个回调函数,在请求成功时执行它。

这是$.ajax()函数的简写,它等同于:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

发送到服务器的数据会追加到URL后面,作为查询字符串。如果data参数的值是一个纯对象,在把它追加到URL之前,它会转换成一个字符串兼url编码。

大多数实现案例将指定一个success处理函数:

$.getJSON( "ajax/test.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" );
});

当然,这个示例取决于JSON文件的结构:

{
  "one": "Singular sensation",
  "two": "Beady little eyes",
  "three": "Little birds pitch by my doorstep"
}

使用这个结构,示例循环遍请求的数据,建了一个无序列表,并把它追加到body上。

把返回的数据传递给success回调函数,返回的数据通常是一个JSON结构的JavaScript对象,或者是一个数组,使用$.parseJSON()方法来解析。它还传递了响应的文本状态。

自从jQuery 1.5,success回调函数接收一个"jqXHR"对象(在jQuery 1.4中,传递XMLHttpRequest对象)。然而,因为JSONP以及跨域GET请求并不使用XHR,在那种情况中,传递给success回调函数的jqXHRtextStatus参数是undefind。

重要:自从jQuery 1.4,如果JSON文件包含了一个脚本错误,请求通常将静默地失败。出于这个原因,要避免经常的手工编辑JSON数据。JSON是一个数据交换格式,其句法规则要比JavaScript的对象字面记号法更严格。举个例子,出现在JSON中所有的字符串,无论它们是属性还是值,都必须用双引号引起来。欲了解JSON格式的详情,参见http://json.org/

JSONP

如果URL包含了字符串“callback=?”(或者类似的,由服务器端API定义),该请求会视为一个JSON请求。参见$.ajax()jsonp的讨论,以了解详情。

jqXHR对象

自从jQuery 1.5,所有的jQuery的Ajax方法会把一个XMLHttpRequest对象的超集。$.getJSON()所返回的这个jQuery XHR对象,或者称“jqXHR”,实现了Promise对象的接口,给它一个Promise对象所有的属性、方法和行为(参见Deferred对象以了解更多信息)jqXHR.done()方法(针对成功状态)、jqXHR.fail()方法(针对出错状态)以及jqXHR.always()方法(针对结束状态,无论是成功还是出错),需取用一个函数参数,在请求终止时调用它们。欲得更多关于这个函数接收的参数的信息,请参阅$.ajax()文档的jqXHR对象部分。

Promise接口还允许jQuery的Ajax方法,包括$.getJSON(),在一个请求上连缀多个.done().fail()以及.always()回调函数,甚至在请求已经结束时继续分配这些回调函数。如果请求已经结束,回调函数会立即被引发。

// 在制作请求之后立即分配回调函数
// 并针对这个请求,记住jqxhr对象
var jqxhr = $.getJSON( "example.json", function() {
  console.log( "success" );
})
  .done(function() {
    console.log( "second success" );
  })
  .fail(function() {
    console.log( "error" );
  })
  .always(function() {
    console.log( "complete" );
  });
 
// 在这里实施别的工作 ...
 
// 为上面的请求设置别的结束函数
jqxhr.complete(function() {
  console.log( "second complete" );
});

弃用提醒

在jQuery 1.5中引入的回调函数jqXHR.success()jqXHR.error()jqXHR.complete()方法,在jQuery 1.5中被建议弃用。为了准备好它们最终被删除,请使用jqXHR.done()jqXHR.fail()jqXHR.always()来代替。

其它说明

  • 因为浏览器的安全限制,大多数Ajax请求要遵守同源策略;请求不能成功地从不同的域名、不同的子域名、不同的端口或者不同的协议检索到数据。
  • script请求和JSONP请求不用服众同域名策略的限制。

示例

从Flicker JSONP API载入四张最近的雷尼尔峰的照片。

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery.getJSON demo</title>
  <style>
  img {
    height: 100px;
    float: left;
  }
  </style>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
 
<div id="images"></div>
 
<script>
(function() {
  var flickerAPI = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
  $.getJSON( flickerAPI, {
    tags: "mount rainier",
    tagmode: "any",
    format: "json"
  })
    .done(function( data ) {
      $.each( data.items, function( i, item ) {
        $( "<img>" ).attr( "src", item.media.m ).appendTo( "#images" );
        if ( i === 3 ) {
          return false;
        }
      });
    });
})();
</script>
 
</body>
</html>

演示结果

如果网页上不能运行示例,请点击http://www.asprain.cn/jQueryAPI/jquery.getjson.htm查看示例。

如果你觉得本文档对你有用,欢迎给翻译作者支付宝打赏,支持翻译作者源源不断翻译更多有用的技术文档。