描述:
使用 "GET" HTTP请求从服务器导入JSON格式数据。
JQuery.getJSON(url [,data] [,success])
url
类型:字符串
一个包含发送请求的链接
data
类型:一般对象([PlainObject](http://api.jquery.com/Types/#PlainObject))或字符串
根据请求被发送至服务器的一般对象或字符串
success
类型:函数对象
请求成功执行的函数
它是一个缩略的Ajax函数,等价于:
$.ajax({
dataType: "json",
url: url,
data: data,
success: success
});
发送给服务器的Data会被附加至URL作为查询字符串。如果data
的参数值是一个一般对象,在被附加至URL之前会被转换为字符串和URL编码形式。
大多数工具都会制定一个成功函数:
$.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结构来定义,是典型地一个JS对象或数组,然后使用parseJSON()
方法来转换。该函数也能响应文本格式。
在JQuery 1.5
中,成功函数接收一个"jqXHR" 对象(在JQuery 1.4
中,它接收XMLHTTPObject
对象)。然后,因为JSONP和跨域的GET请求不使用XHR,所以在这样的案例中传入成功函数的jqXHR和textStatus属于未定义。
重要:
在
JQuery 1.5
中,如果JSON文件包含一个语法错误,请求通常会默默失败,避免因为这个原因而频繁地手动修改JSON数据。JSON这种数据交换格式,拥有比其它JS对象的文字记法严格的多的语法规则。例如,JSON中的所有字符串,无论是属性还是值,都必须用双引号引起。查询更多JSON格式的语法细节,请参考:http://json.org/.
JSONP
如果传入的URL包括字符串“callback=?”(或类似的,由服务器API定义的),该请求会被替代为JSONP请求。参考$.ajax()中有关JSONP
的讨论获得更多细节。
jqXHR对象
在JQuery 1.5 中,所有的JQuery Ajax 方法都会返回一个XMLHTTPObject
对象的超集。这个JQuery XHR对象,即jqXHR,由$.getJSOn
,Promise
接口返回,返回一个Promise
全部的属性,方法和行为(参阅: Deferred object)。jqXHR.done()
(用于成功),jqXHR.fail()
(用于错误)和jqXHR.always()
(用于完成,无论成功与否,于JQuery 1.6
添加)都会在请求结束时传入一个函数作为参数执行。关于这个函数接收的参数的更多信息,请参阅$.ajax
文档的jqXHR Object 一节。
JQuery 1.5
的Promise
接口允许JQuery Ajax
方法,包括$.getJSON()
,在一个请求中,链式添加.done()
,.always()
,和.fail()
回调,甚至在请求可能完成时分配这些回调。如果请求已经完成,回调会被立即清除。
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
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" );
});
// Perform other work here ...
// Set another completion function for the request above
jqxhr.complete(function() {
console.log( "second complete" );
});
清除说明:
jqXHR.success()
,jqXHR.error()
和jqXHR.complete
已经在JQuery 3.0
中被移除,取而代之的是jqXHR.done()
,jqXHR.fail()
,jqXHR.always()
。
附加说明:
- 因为浏览器的安全限制,大多
“Ajax”
请求都是同源策略的对象:请求不会成功取回来自不同域,子域,端口或协议的数据。 -
Script
和JSONP
请求不是同源策略的对象。
例子:
使用 Flicker JSONP API 导入四张最近关于Mount Rainer 的图片
<!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>
Demo
从text.js
中导入JSON
数据,然后从返回的JSON
数据中获得name
:
$.getJSON( "test.js", function( json ) {
console.log( "JSON Data: " + json.users[ 3 ].name );
});
从text.js
中导入JSON
数据,传递额外的数据,然后从返回的JSON
数据中获得name
,如果出现错误,写下错误信息:
$.getJSON( "test.js", { name: "John", time: "2pm" } )
.done(function( json ) {
console.log( "JSON Data: " + json.users[ 3 ].name );
})
.fail(function( jqxhr, textStatus, error ) {
var err = textStatus + ", " + error;
console.log( "Request Failed: " + err );
});
以上是我翻译JQuery
文档的第一篇稿,疏漏或错误的地方,希望指正,欢迎来评论区讨论。初来乍到,多多关照。 :)