jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第2层是load()、$.get()和$.post()方法,第3层是$.getScript()和$.getJSON()方法。第2层的方法使用频率最高。
1. load()方法
1.1 载入HTML文档
load()方法是jQuery中最为简单和常用的Ajax方法,能载入远程HTML代码并插入DOM中。它的结构为:
load(url[,data][,callback])
参数名称 | 类型 | 说明 |
url | string类型 | 请求html页面的url地址 |
data(可选) | object类型 | 发送至服务器的key/value数据 |
callback(可选) | function类型 | 请求完成时的回调函数,无论请求成功或失败 |
1.2 筛选载入的HTML文档
load()方法的URL参数的语法结构为:"url selector"。注意,URL和选择器之间有一个空格。
$("#msg").load("ajax.html .para");//只需要加载ajax.html页面中class为"para"的内容
1.3 传递方式
load()方法的传递方式根据参数data来自动指定。如果没有参数传递,则采用GET方式传递;反之,则会自动转换为POST方式。
$("#resText").load("test.php",{name:"rain",age:"22"},function(){//...});
1.4 回调函数
对于必须在加载完成后才能继续的操作,load()方法提供了回调函数,该函数有3个参数,分别代表请求返回的内容、请求状态和XMLHttpRequest对象。
$("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){// responseText: 请求返回的内容// textStatus: 请求状态:success、error、notmodified、timeout 4种// XMLHttpRequest: XMLHttpRequest对象});
在load()方法中,无论Ajax请求是否成功,只要当请求完成后,回调函数就被触发。
2. $.get()方法和$.post()方法
2.1 $.get()方法
$.get()方法使用GET方式来进行异步请求。它的结构为:
$.get(url[,data][,callback][,type])
$.get()方法的回调函数只有两个参数:返回内容data和请求状态status。
参数名称 | 类型 | 说明 |
url | String | 请求的HTML页的URL地址 |
data(可选) | Object | 发送至服务器的key/value数据回作为QueryString附加到请求URL中 |
callback(可选) | Function | 载入成功时回调函数(只有当Response的返回状态是success才调用该方法)自动将请求结果和状态传递给该方法 |
type(可选) | String | 服务器端返回内容的格式,包括xml、html、script、json、text和_default |
返回内容data的格式有:
(1)HTML片段
(2)XML文档
由于期待服务器返回的数据格式是XML文档,因此需要在服务端设置Content-Type类型,代码如下:
header("content-type:text/xml;charset=utf-8"); //PHP
(3)JSON文件
2.2 $.post()方法
与$.get()的区别:
(1) get请求会将参数跟在URL后进行传递,而post请求则是作为HTTP消息的实体内容发送给web服务器。(2) get方式对传输的数据有大小限制(<=2kb),而使用POST方式传递的数据量不受限制(3) get方式请求的数据会被浏览器缓存起来,引起安全性问题(4) get方式和post方式传递的数据在服务器端的获取也不相同。php中,get方式的数据可以用$_GET[]获取,而post方式可以用$_POST[]获取。两种方式都可以用$_REQUEST[]来获取。
由于post和get方式提交的所有数据都可以通过$_REQUEST[]来获取,因此只需要改变jQuery函数,就可以在get请求和post请求之间切换。
另外,当load()方法带有参数传递时,会使用post方式发送请求。因此也可以使用load()方法来完成同样的功能。如:
$(function(){$("#send").click(function(){$("#resText").load("post1.php",{username:$("username").val(),content:$("#content").val()});});});
3. $.getScript()方法和$.getJson()方法
3.1 $.getScript()
有时,在页面初次加载时就取得所需的全部JavaScript文件是完全没有必要的。虽然可以在需要哪个JavaScript文件时,动态创建<script>标签。jQuery代码如下:
$(document.createElement("script")).attr("src","test.js").appendTo("head");
或者
$("").appendTo("head");
但是,这种方式并不理想,jQuery提供了$.getScript()方法来直接加载.js文件:
$(function(){$("#send").click(function(){$.getScript("test.js");});});
3.2 $.getJSON()
$.getJSON()方法用于加载JSON文件,与$.getScript()方法的用法相同。
$(function(){$("#send").click(function(){$.getJSON("test.json",function(data){//data:返回的数据});});});
4. $.ajax()方法
它是jQuery最底层的Ajax实现。它的结构为:
$.ajax(options)
该方法只有1个参数,但在这个对象里包含了$.ajax()方法所需要的请求设置以及回调函数等信息,参数以key/value的形式存在,所有参数都是可选的。
前面用到的$.load()、$.get()、$.post()、$.getScript()和$.getJSON()这些方法,都是基于$.ajax()方法构建的,$.ajax()方法是jQuery最底层的Ajax实现,因此可以用它来代替前面的所有方法。
例如,采用如下代码代替$.getScript()方法:
$(function(){$("#send").click(function(){$.ajax({type:"GET",url:"test.js",dataType:"script"});});});
再如使用$.ajax()方法代替$.getJSON()方法:
$(function(){$("#send").click(function(){$.ajax({type:"GET",url:"test.json",dataType:"json",success:function(data){$("#resText").empty();var html = "";$.each(data,function(commentIndex,comment){html += "
5. 序列化元素
5.1 serialize()方法
与jQuery中其他方法一样,serialize()方法也是作用于一个jQuery对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求。
$("#send").click(function(){ $.get("get1.php", $("#form1").serialize(), function(data, status) { $("#msg").html(data); });});
因为serialize()方法作用于jQuery对象,所以不光只有表单能使用它,其他选择器的元素也都能使用它。
5.2 serializeArray()方法
该方法不是返回字符串,而是将DOM元素序列化后,返回JSON格式的数据。
5.3 $.param()方法
它是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化。
var obj = {a:1,b:2,c:3};var k = $.param(obj);alert(k); //输出a=1&b=2&c=3
7. jQuery中的Ajax全局事件
通过jQuery提供了一些自定义全局函数,能够为各种上与Ajax相关的事件注册回调函数。例如当Ajax请求开始时,会触发ajaxStart()方法的回调函数;当Ajax请求结束时,会触发ajaxStop()方法的回调函数。
例如:某个网站图片过多,在Ajax请求过程中,只要图片还未加载完毕,就会一直显示“加载中...”的提示信息。可以极大地改善用户的体验。
加载中...
$("#loading").ajaxStart(function(){ $(this).show();});$("#loading").ajaxStop(function(){ $(this).hide();});
如果想使某个Ajax请求不受全局方法的影响,那么可以在使用$.ajax(options)方法时,将参数中的global设置为false,jQuery代码如下:
$.ajax(){ url: "test.html", global: false //不触发全局Ajax事件}
完毕!
" + comment["username"] + ":
" + comment["comment"] + "