4.3.3 用jQuery获取动态数据
《Ajax实战:实例详解》第4章Ajax开源工具集,讨论支持Ajax的JavaScript库并进一步讲解Prototype、Dojo工具箱、jQuery和DWR库,另外特别介绍了它们给Ajax带来的变化。本小节为大家介绍的是用jQuery获取动态数据。
4.3.3 用jQuery获取动态数据
在上一节中,我们介绍了jQuery的load()方法,它可以非常轻松地执行获取HTML片段并把它加载到一个DOM元素中的任务。虽然这个方法非常好用,但是有时我们却想要获得对Ajax请求过程的更多控制权,或者想从服务器获得数据(而不是预格式化好的HTML)。
在本节中,我们将探索jQuery在Ajax领域提供的更多的东西。
1.问题
我们希望扩展之前的代码,使它从页面初始化的异步请求中获得电子冰箱内的食物列表。
2.解决方案
回顾下上一个解决方案,可以发现为了动态地加载选择框的选项,我们需要做的修改就是从
好,这样看起来就比较熟悉了。$.get()函数是作为一个类方法定义的,也就是jQuery封装器函数的一个函数属性(如果类方法的概念还是让你很头痛,那么最好能回顾一下3.1.3节)。
虽然,我们知道了它们是作为jQuery封装器类的类方法,但是jQuery却把这些方法定义为实用的函数,并且还让它们同jQuery的术语保持一致。这就是我们将要在本节中应用它们的方式。
$.get()函数接受的参数和load()方法一样:请求的URL,一个请求参数的hash,以及一个在请求完成后执行的回调函数。在使用这个函数时,因为并没有封装的对象来自动地把响应填入其中,所以最好是明确指定可选参数的回调函数。这是在请求完成后处理事务的主要手段。
还必须注意的是,如果没有传递请求参数,还可以指定回调函数作为函数的第二个参数。
在内部,jQuery用了一些JavaScript的技巧来保证取得的是正确参数。
下面是用这个实用的函数重写的showItemInfo():
除了使用$.get()函数外,对之前的代码所做的另一个修改是增加了一个回调函数作为第三个参数。我们可以用它来把返回的HTML插入到itemData元素中。
于是,我们用另外两个封装器方法:empty(),它用来清除封装的DOM元素;append(),它用来给封装的元素增加用data参数传递给回调函数的HTML片段。
现在,我们已经准备好要在文档加载后给填入从服务器获得的数据。这里,我们将采用JavaScript hash对象的格式,从服务器获得原始数据。虽然我们可以返回XML数据,但是为了使JavaScript代码便于处理,将采用JSON。
jQuery再次用一个实用的函数帮了我们的大忙,它非常适合这次的任务:$.getJSON()。这个函数接受已经非常熟悉的三个参数:一个URL,一个请求参数的hash,以及一个回调函数。
用$.getJSON()所带来的优势是,回调函数调用时将获得已经执行过的JSON结构体。我们不再需要去对返回的响应做任何的执行。多么方便啊!
用这个实用的方法,需要在文档的ready()句柄中加入下面这一行:
一个fetchItemList.jsp的JSP页面被作为URL,并且提供了loadItems()(接下去会看到它的定义)函数作为回调。注意,因为我们不需要传递任何请求参数,所以就可以简单地忽略对象hash,并提供回调函数,把它作为第二个参数。
LoadItems()函数定义如下:
当调用回调函数时,请求字符串已经被转换成一个JavaScript对象数组,其中每个对象都包含了一个id和一个name属性。每个对象还将被用来构造一个新的元素,并用一种熟悉的方式把它加入到select控件中 ,这在4.2.1节的解决方案中已经出现过。
为了给