一个AJAX解决方案中涉及的技术如下:
在不需要与其他应用程序共享数据的情况下,以HTML片段提供外部数据一般来说是最简单的。
如果数据需要重用,而且其他应用程序也可能因此受到影响,那么在性能和文件大小方面具有优势的JSON通常是不错的选择。
而当远程应用程序未知时,XML则能够为良好的互操作性提供最可靠的保证。
JavaScript对象就是由一些"键-值"对组成的,而且可以方便地使用花括号({})来定义。JavaScript的数组则可以使用方括号([])进行动态定义。将这两种语法组合起来,可以轻松地表达复杂而且庞大的数据结构。Douglas Crockford为利用这种简单的语法起了一个名字,叫做 JSON(JavaScript Object Notation,JavaScript对象表示法)。通过这种表示法能够方便地取代数据量庞大的XML格式。
{ "key": "value", "key2": [ "array", "of", "items" ] }
更多关于JSON的介绍:http://json.org/json-zh.html
$.getJSON():全局函数,作为全局jQuery对象的方法定义,不是个别jQuery对象实例的方法,作为结果的对象只能提供给脚本,而不能插入到页面中。
$.each():全局函数,不操作jQuery对象,它以一个数组或映射作为第1个参数,以一个回调函数作为第2个参数。此外,还需要将每次循环中数组或映射的当前索引和当前项作为回调函数的两个参数。
仍然以XMPP的roster为例。
新建roster.json:
[ { "name": "User1", "group": "G1" }, { "name": "User2", "group": "G1" }, { "name": "User3", "group": "G2" }, { "name": "User4", "group": "G2" }, { "name": "User5", "group": "G1" }, { "name": "User6", "group": "G3" }, { "name": "User7", "group": "G2" }, { "name": "User8", "group": "G3" }, { "name": "User9", "group": "G1" }, { "name": "User10", "group": "G1" } ]
注意前后是方括号,不要写成大括号。键值都要用引号。
新建index.html:需要jQuery
<!DOCTYPE html> <html> <head> <script src="jquery-1.8.2.min.js"></script> <script src="script.js"></script> <meta charset=utf-8 /> <title>getJSON Demo</title> </head> <body> <button id='get_roster'>Get Roster</button> <ul id='roster'> </ul> </body> </html>
新建script.js:
$(document).ready(function () { $('#get_roster').click(function () { $.getJSON('roster.json', function (data) { //清空列表 $('#roster').empty(); //遍历item $.each(data, function(index, item) { //获得group值 var group = item['group']; if ($('#roster').find('#' + group).length === 0) { var group_html = '<li><span class="group">' + group + '</span><ul id="' + group +'"></ul></li>'; $('#roster').append($(group_html)); } var item_html = '<li class="item"><span class="name">' + item['name'] + '</span></li>'; $('#roster #' + group).append($(item_html)); }); }); }); });注意获得name和group的方式:item['group']和item['name'],也可以写成item.group和item.name
尽管JSON格式很简洁,但它却不容许任何错误。所有方括号、花括号、引号和逗号都必须合理而且适当地存在,否则文件不会加载。而且,在多数浏览器中,当文件不会加载时我们都看不到错误信息;脚本只是静默地彻底中止运转。
有时候,在页面初次加载时就取得所需的全部JS也是没有必要的。具体需要取得哪个脚本,要视用户的操作而定。虽然可以在需要时动态地引入<script>标签,但注入所需代码的更优雅的方式则是通过jQuery直接加载.js文件。
新建roster.js:将上面对JSON处理的函数提取到单独的JS文件中
var rosters = [ { "name": "User1", "group": "G1" }, { "name": "User2", "group": "G1" }, { "name": "User3", "group": "G2" }, { "name": "User4", "group": "G2" }, { "name": "User5", "group": "G1" }, { "name": "User6", "group": "G3" }, { "name": "User7", "group": "G2" }, { "name": "User8", "group": "G3" }, { "name": "User9", "group": "G1" }, { "name": "User10", "group": "G1" } ]; $('#roster').empty(); //遍历item,代码与上面没多少区别 $.each(rosters, function () { //获得group值 var group = this.group; if ($('#roster').find('#' + group).length === 0) { var group_html = '<li><span class="group">' + group + '</span><ul id="' + group +'"></ul></li>'; $('#roster').append($(group_html)); } var item_html = '<li class="item"><span class="name">' + this.name + '</span></li>'; $('#roster #' + group).append($(item_html)); });修改script.js:
$(document).ready(function () { $('#get_roster').click(function () { $.getScript('roster.js'); }); });