锋利的jQuery第6章 jQuery与Ajax的应用
终于开始学习Ajax了,忍不住小激动一下,以前也看过一些,不过不明白,后来实现了一下,感觉似乎懂了,但是还是不全面,现在全面学习一下。
1,学习ajax,需要一个集成环境AppServ,它包含apache,apache monitor,php,mysql,php-nuk和phpMy Admin.下载地址是http://www.appservnetwork.com/
2,传统的js处理ajax如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="javascript" type="text/javascript"> //通过这个函数来异步获取信息 function Ajax(){ var xmlHttpReq = null; //声明一个空对象用来装入XMLHttpRequest if (window.ActiveXObject){//IE5 IE6是以ActiveXObject的方式引入XMLHttpRequest的 xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest){//除IE5 IE6 以外的浏览器XMLHttpRequest是window的子对象 xmlHttpReq = new XMLHttpRequest();//实例化一个XMLHttpRequest } if(xmlHttpReq != null){ //如果对象实例化成功 xmlHttpReq.open("GET","test.php",true); //调用open()方法并采用异步方式 xmlHttpReq.onreadystatechange=RequestCallBack; //设置回调函数 xmlHttpReq.send(null); //因为使用get方式提交,所以可以使用null参调用 } function RequestCallBack(){//一旦readyState值改变,将会调用这个函数 if(xmlHttpReq.readyState == 4){ if(xmlHttpReq.status == 200){ //将xmlHttpReq.responseText的值赋给ID为 resText 的元素 document.getElementById("resText").innerHTML = xmlHttpReq.responseText; } } } } </script> </head> <body> <input type="button" value="Ajax提交" onclick="Ajax();" /> <div id="resText" ></div> </body> </html>
test.php代码是:
<?php echo "Hello Ajax!"; ?>
3,load()方法,方法结构是:load(url,[,data],[,callback])它能远程载入html代码并插入dom.
data是发送到服务器的key/value数据,callback请求完成时的回调函数(无论请求成功与失败)
$(element).load(url,data,callback); callback定义如下: function(responseText,textStatus,XMLHttpRequest){ //responseText:请求返回的内容 //textStatus:请求状态:success,error,notmodified,timeout4; //XMLHttpRequest对象。 }
(1)加载test.html,首先建一个文件test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset="utf-8" /> </head> <body> <div class="comment"> <h6>张三:</h6> <p class="para">沙发.</p> </div> <div class="comment"> <h6>李四:</h6> <p class="para">板凳.</p> </div> <div class="comment"> <h6>王五:</h6> <p class="para">地板.</p> </div> </body> </html>
然后新建一个html文件如下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> * { margin:0; padding:0;} body { font-size:12px;} .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;} .comment h6 { font-weight:700; font-size:14px;} .para { margin-top:5px; text-indent:2em;background:#DDD;} </style> <!-- 引入jQuery --> <script src="../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script language="javascript" type="text/javascript"> $(function(){ $("#send").click(function(){ $("#resText").load("test.html"); //加载html页面 }) }) </script> </head> <body> <input type="button" id="send" value="Ajax获取" /> <div class="comment"> 已有评论: </div> <div id="resText" ></div> </body> </html>
其中$("#resText").load("test.html"); //加载html页面
还可以选择性的加载,比如只加载class="para"的元素,只需要在url后面加上jQuery选择器:
$("#resText").load("test.html .para");//注意中间的空格
(2)指定参数使用post,没有参数用get方法。
回调函数有三个参数,function(responseText,textStatus,XMLHttpRequest),responseText是请求返回的内容,textStatus是请求状态:success,error,notmodified,timeout 4中;XMLHttpRequest对象。
下面还是上面的test.html,下面是对应的代码:
$("#send").click(function () { $("#resText").load("test.html .para", function (responseText, textStatus, XMLHttpRequest) { alert($(this).html());//this是当前选择出来的dom文档,(如果没有选择器,得到head和body之间的内容) alert(responseText); //响应内容是test.html(整个文档) alert(textStatus);//状态是sucess alert(XMLHttpRequest); //XMLHttpRequest对象 }); });
4,$.get()和$.post()方法,都是全局函数
(1)$.get(url [,data] [,callback] [,type] ),
url是请求的地址,
data是发送到服务器的key/value数据会做为QueryString附加到请求的url中,
callback载入成功时的回调函数(只有当response返回状态是success才调用该方法)自动将请求结果和状态传递给该方法;
type是服务器返回内容的格式,包含html,xml,json,script,text,_dafault.
(2)$.get()的回调函数只有2个参数,function(data,textStatus),
data是返回的内容,可以是xml,json,html等;
textStatus是请求状态success,error,notmodified,timeout 4种。只有返回success时才会执行。
(3)下面是例子,
首先建立一个asp.net空网站,然后添加一个index.html,下面是代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> </style> <script src="jquery-1.4.2.min.js" type="text/javascript"></script> <script type="text/javascript" language="javascript" > $(document).ready(function () { //等待所有dom绘制完成后就执行 $("#send").click(function () { $.get("Default.aspx", { //发送的数据 "username": $("#username").val(), "content": $("#content").val() }, function (data, textState) { $("#resText").html(data); //将返回的数据加到resText中 },"html");//要求返回html }); }); //$(document) </script> </head> <body> <form id="form1" action="#"> <p>评论:</p> <p>姓名: <input type="text" name="username" id="username" /></p> <p>内容: <textarea name="content" id="content" rows="2" cols="20"></textarea></p> <p><input type="button" id="send" value="提交"/></p> </form> <div class='comment'>已有评论:</div> <div id="resText" > </div> </body> </html>
然后简历一个default.aspx页面,在后台代码中添加下面代码:
protected void Page_Load(object sender, EventArgs e) { string username = Request.Form["username"]; //post方法传递的参数使用Form获取 if (string.IsNullOrEmpty(username)) { username = Request.QueryString["username"];//get方法传递的参数使用QueryString获取 } string content = Request.Form["content"]; if(string.IsNullOrEmpty(content)) { content = Request.QueryString["content"]; } string str = "<p>" + username + "说:" + "</p>" + content + ""; Response.Write(str); }
起初就是得不到传过去的值,后来调试发现,得到的值为空,恍然大悟啊
要获取get方法的参数,使用Request.QueryString["username"];
要获取post方法的参数,使用Request.Form["username"];
本例子中两种方式都可以。
(4)$.post(url [,data] [,callback] [,type] )的用法和上面的差不多,区别如下
a1,get请求会将参数跟着url后面传递,post方法将参数做为http消息的实体内容发送给web服务器。
b2,get方式对传输数据有大小限制(小于2kb),使用post理论上不受限。
c3,get方式请求的数据会被缓存,可以从浏览器历史记录中查看,有安全问题。
d4,get方式和post方式在asp.net服务器端获取方式不同,参看上面的例子。
5,$.getScript()和$.getJson()方法
(1)有时页面初次加载不需要全部的javascript文件,可以使用$.getScript()在需要的时候加载如下:
$.getScript('jquery.color.js',function(){ //回调函数,加载成功后执行 });
下面是一个例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> </style> <script src="jquery-1.4.2.min.js" type="text/javascript"></script> <script type="text/javascript" language="javascript" > $(document).ready(function () { //等待所有dom绘制完成后就执行 $("#send").click(function () { $.getScript("test.js"); }); }); //$(document) </script> </head> <body> <p> <input type="button" id="send" value="加载"/> </p> <div class="comment">已有评论:</div> <div id="resText" > </div> </body> </html>
var comments = [ { "username": "张三", "content": "沙发." }, { "username": "李四", "content": "板凳." }, { "username": "王五", "content": "地板." } ]; var html = ''; $.each( comments , function(commentIndex, comment) {//$.each前面的参数是集合,回调函数里的第二参是单个对象或元素 html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>'; }) $('#resText').html(html);
注意方法:$.each()用来遍历数组和对象,如
$.each( comments , function(commentIndex, comment) {
//$.each前面的参数comments是集合,commentIndex是对象的成员或数组的索引,comment是单个对象或元素
} comment是comments的一个元素。
(2)$.getJson()用于加载json文件,下面是例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> * { margin:0; padding:0;} body { font-size:12px;} .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;} .comment h6 { font-weight:700; font-size:14px;} .para { margin-top:5px; text-indent:2em;background:#DDD;} </style> <!-- 引入jQuery --> <script src="../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ $(function(){ $('#send').click(function() { $.getJSON('test.json', function(data) { $('#resText').empty(); var html = ''; $.each( data , function(commentIndex, comment) { html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>'; }) $('#resText').html(html); }) }) }) //]]> </script> </head> <body> <br/> <p> <input type="button" id="send" value="加载"/> </p> <div class="comment">已有评论:</div> <div id="resText" > </div> </body> </html>
[ { "username": "张三", "content": "沙发." }, { "username": "李四", "content": "板凳." }, { "username": "王五", "content": "地板." } ]
然后就可以加载了。
6 $.ajax()方法,这是一个底层ajax实现,结构是$.ajax(options).如下图
下面是一个例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> </style> <script src="jquery-1.4.2.min.js" type="text/javascript"></script> <script type="text/javascript" language="javascript" > $(document).ready(function () { //等待所有dom绘制完成后就执行 $("#send").click(function () { $.ajax({ type: "GET", //方法get,post url: "test.json", //请求地址 dataType: "json", //返回类型 success: function (data) { //成功后执行的函数,data是返回数据 $("#resText").html(); //清空内容 var html=''; $.each(data, function (index, content) { html += '<div>' + content["username"] + '说:' + content["content"] + '</div>'; }); $("#resText").html(html); } }); }); }); //$(document) </script> </head> <body> <br/> <p> <input type="button" id="send" value="加载"/> </p> <div class="comment">已有评论:</div> <div id="resText" > </div> </body> </html>
[ { "username": "张三", "content": "沙发." }, { "username": "李四", "content": "板凳." }, { "username": "王五", "content": "地板." } ]
<form id="form1" action="#"> <p>评论:</p> <p>姓名: <input type="text" name="username" id="username" /></p> <p>内容: <textarea name="content" id="content" rows="2" cols="20"></textarea></p> <p><input type="button" id="send" value="提交"/></p> </form> <div class='comment'>已有评论:</div> <div id="resText" > </div>
7,
(1)serialize()方法,序列化元素,作用于一个jQuery对象,将DOM元素序列化为字符串,用于Ajax请求。
(2)
$("#send").click(function () { var $data = $(":checkbox,:radio").serialize();//取出来选中的checkbox和radio alert($data); //比如输出 check=1&check=2&radio=1 对应value });
(3)$.param()方法用来对一个数组或者对象按照key/value进行序列化。
var obj = { a: 1, b: 2, c: 3 }; var k = $.param(obj); //对一个数组或对象按照key/value序列化 alert(k) // 输出 a=1&b=2&c=3
(4)
<script type="text/javascript"> $(function(){ $("#send").click(function(){ $.get("get1.php", $("#form1").serialize() , function (data, textStatus){ $("#resText").html(data); // 把返回的数据添加到页面上 } ); }) }) </script>
直接把表单form1全部提交过去,这样对于表单数据较多时有好处。
8,jquery中的全局事件
(1)通过jQuery提供的一些自定义全局函数,能够为各种与ajax相关的事件注册回调函数。当ajax请求开始时,
会触发ajaxStart()方法的回调函数,当ajax请求结束时,会触发ajaxStop()方法的回调函数。这些都是全局方法。
ajaxComplete(callback) ajax请求完成时执行的函数
ajaxError(callback) ajax请求失败时执行的函数,捕捉到的错误可以做为最后一个参数传递
ajaxSend(callback) ajax请求发送前执行的函数
ajaxSuccess(callback) ajax请求成功执行的函数。
如果想让某个ajax请求不受全局方法的影响,可以使用$.ajax()方法时设置global为false.
<br/> <div id="loading">加载中...</div>
当加载是显示这个提示:
//共用这2个全局的ajax事件 $("#loading").ajaxStart(function () { $(this).show(); }); $("#loading").ajaxStop(function () { $(this).hide(); });