当前位置:嗨网首页>书籍在线阅读

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() 方法有两个可选的参数 datacallbackdata 参数可以是一个映射对象(或者JavaScript对象)或者一个字符串(自jQuery 1.3起)。下面的例子传入值为 worldhello 变量。(这和如下的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() 方法接受的参数有 urldatacallbacktype 。前三个参数的作用和前面的 load() 方法一样,所以只介绍最后一个参数 type:

$.get(
   'hello-world.html',
   { hello: 'world' },
   function(data) {
     alert('Request completed!');
   },
  'html'
);

type 参数可以接受如下值: xmlhtmlscriptjsonjsonptext 。这些 type 值确定来自Ajax请求的响应文本在传递到回调函数之前如何处理。在前一个例子中,因为指定 type 参数 html ,所以回调函数的数据参数将为DOM对象的形式。使用 xml 作为 type 参数值将传递 xml DOM对象。如果 type 参数指定为 script , 服务器返回的结果数据将在触发 callback 方法之前执行。 jsonjsonp 格式都会将一个JavaScript对象传递给 callback 方法, jsonp 的不同之处在于jQuery将在请求中传递一个方法名称,将回调方法映射到请求定义的匿名函数。这样做允许跨域请求。最后, text 格式正如其名:以字符串形式将普通文本传递给 callback 方法。

现在,我们来看看最后两个快捷方法: $.getJSON()$.getScript()$.getJSON() 方法接受 urldatacallback 参数。 $.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);