18-讨论
16.4.3 讨论
本秘诀和其他秘诀略有不同,我们将纵览jQuery提供的多个函数和快捷方法,清晰地表现它们之间的差异。
jQuery提供了一些发出Ajax请求的快捷方法。根据前面介绍Ajax的秘诀,存在如下的快捷方法: .load()
、 $.get()
、 $.getJSON()
、 $.getScript()
和 $.post()
,但是我们首先回顾自己的解决方案:
$('#contents').load('hello-world.html');
.load(url)
方法对 hello-world.html
发出一个GET Ajax请求,并在 #contents
中放置结果的内容。 .load()
方法有两个可选的参数 data
和 callback
。 data
参数可以是一个映射对象(或者JavaScript对象)或者一个字符串(自jQuery 1.3起)。下面的例子传入值为 world
的 hello
变量。(这和如下的URL一样: helloworld.html?hello=world
)
$('#contents').load('hello-world.html', { hello: 'world' });
第三个可选参数是一个回调函数,在请求完成( success
或者 error)
时调用。在下面的例子中,请求完成时触发一条警告消息:
$('#contents').load('hello-world.html', { hello: 'world' }, function() {
alert('Request completed!');
});
接下来要研究的两个方法是 $.get()
和 $.post()
。这两个方法都接受相同的参数, $.get()
方法发送一个GET HTTP请求,而 $.post()
方法发送一个POST HTTP请求。我们将研究一个使用 $.get()
请求的示例。 $.get()
方法接受的参数有 url
、 data
、 callback
和 type
。前三个参数的作用和前面的 load()
方法一样,所以只介绍最后一个参数 type:
$.get(
'hello-world.html',
{ hello: 'world' },
function(data) {
alert('Request completed!');
},
'html'
);
type
参数可以接受如下值: xml
、 html
、 script
、 json
、 jsonp
或 text
。这些 type
值确定来自Ajax请求的响应文本在传递到回调函数之前如何处理。在前一个例子中,因为指定 type
参数 html
,所以回调函数的数据参数将为DOM对象的形式。使用 xml
作为 type
参数值将传递 xml
DOM对象。如果 type
参数指定为 script
, 服务器返回的结果数据将在触发 callback
方法之前执行。 json
和 jsonp
格式都会将一个JavaScript对象传递给 callback
方法, jsonp
的不同之处在于jQuery将在请求中传递一个方法名称,将回调方法映射到请求定义的匿名函数。这样做允许跨域请求。最后, text
格式正如其名:以字符串形式将普通文本传递给 callback
方法。
现在,我们来看看最后两个快捷方法: $.getJSON()
和 $.getScript()
。 $.getJSON()
方法接受 url
、 data
和 callback
参数。 $.getJSON()
实际上是 $.get()
方法和为JSON或者JSONP设置的相关参数的组合体。下面的例子将向Filckr发起一个 JSONP
请求,从公共时间线(public timeline)请求照片:
$.getJSON(
'http://www.flickr.com/services/feeds/photos_public.gne?
format=json&jsoncallback=?',
function(json) {
}
);
因为这个请求是跨域的,jQuery自动将请求当作JSONP处理,并填写对应的 callback
函数名。这也意味着,jQuery将在文档中插入一个 <script>
标记初始化请求,代替XMLHttpRequest对象。Flickr的API允许设置 jsoncallback get
变量以指定 callback
函数名。你将会注意到URL的 jsoncallback=?
部分。jQuery将智能地用对应的函数名自动替换 ?
。默认情况下,jQuery将附加一个 callback=
变量,但是允许像例子中展示的那样对其进行修改。 callback
替换在GET和POST请求URL上都有效,但是对于数据对象中传入的参数无效。使用JSON的方法参见秘诀16.7和秘诀16.8,Flickr示例的完整JSONP实现参见秘诀16.9。
$.getScript()
通过Ajax请求或者动态插入用于跨域支持的 <script>
执行请求,然后评估返回的数据并最终触发所提供的回调函数。在下面的例子中,将在文档中添加一个脚本,然后调用回调中提供的一个函数:
// hello-world.js
function helloWorld(msg) {
alert('Hello world! I have a message for you: ' + msg);
}
// hello-world.html
(function($) {
$(function() {
$.getScript('hello-world.js', function() {
helloWorld('It is a beautiful day!');
});
});
})(jQuery);