Ajax技术就是利用javascript和xml实现异步交互的功能。
首先先来介绍一下Ajax相关知识点,如果这些你都会的话,请直接跳转到封装ajax框架!(代码篇)
一、Ajax对象的创建
1、创建Ajax对象的方式
a、第一种方式是针对IE浏览器
b、第二种方式针对w3c:在IE的高版本(IE8+),已经支持了XMLHttpRequest类
2、解决兼容性
a、创建公共文件 public.js
b、在需要使用ajax对象的页面中,包含以上js文件
二、ajax对象的相关属性和方法
方法:
1、初始化ajax对象 open(method,url)
method:请求方式 get、post
url:请求地址
2、设置请求头信息 setRequestHeader(header,value)
header:请求头的名称
value:请求头的信息
3、开始发送请求 send(content)
只有当ajax对象的send方法被调用时,才会发送请求
content :post请求时所传递的数据,get请求时这里直接设置为null
属性:
1、当ajax对象状态码发生改变时所触发的回调函数:onreadystatechange
它的值是一个函数首地址(匿名函数)
xhr.onreadystatechange = function(){}
2、ajax对象的状态码(一个数字,从0-4): readyState
3、ajax对象接收到的响应状态码(常用)(200、302、404):status
4、ajax对象接收到的http响应状态文本(不常用):statusText
5、ajax对象接收到http响应主体字符串(text/html):responseText
6、ajax对象接收到的http响应主体内容(text/xml):responseXML
三、发送GET请求
1、 向服务器发送用户名,并返回hello,zhangsan
php代码如下:
return:返回,将结果返回给php程序本身
echo:输出,利用http协议将数据响应给客户端
上面代码不足之处:
a、如果将请求地址改为一个不存在的页面地址,那么服务器仍然会返回一个错误信息,而我们的程序应该在得到一个正确的返回结果后才去对数据进行处理。
2、解决IE缓存问题(将服务器端的PHP略做修改)
在IE下,仍然输出hello,zhangsan、其他浏览器中是正常输出
原因:在IE中,默认有缓存功能,将每次获取的php文件的输出结果缓存下来,下次ajax对象请求时,如果在缓存目录下,找到对应缓存文件,就直接使用缓存文件。
解决方式:
a、在url后面加随机数:Math,random( );
var URL = "demo.php?name=zhangsan&n="+Math.random();
b、在url后面加(毫秒)时间戳:new Date().getTime();
var URL = "demo.php?name=lisi&n="+new Date().getTime();
以上两种方法确保每次请求的url是唯一的。
c、设置ajax对象的请求头,if-modified-since,强制让ajax对象发送请求。
0:表示文件最后修改时间会和服务器上这个资源文件最后修改时间进行比较,肯定是不同的,所以服务器返回了最新数据
xhr.setRequestHeader("If-Modified-Since","0");
以上三种方式并没有根本上解决缓存问题,前两种方式更是缓存下来N个文件。
d、设置http响应头中的cache-control选项,告诉浏览器不要缓存,必须每次重新请求
实例:检查用户名是否可用
1
2
3
4
5
检查用户名是否存在6
7
8
9 $(function(){10 //创建ajax对象,此时状态码为0
11 varxhr=creatxhr();12 $("#name").blur(function() {13 varname=$(this).val();14 //方法1:随机数
15 varURL= "demo.php?name="+name+"&n="+newDate().getTime();16 //初始化ajax对象 此时状态码为1
17 xhr.open("get",URL);18 //ajax对象状态码发生改变时所触发的回调函数
19 xhr.onreadystatechange= function(){20 //状态码为4说明接收完毕,做进一步的处理
21 if(xhr.readyState== 4 &&xhr.status== 200){22 if(xhr.responseText== 1){23 $(".error").html("用户名已存在").css({display:"inline-block",color:"red"});24 }else{25 $(".error").css({display:"none"});26 return false;27 }28 }29 };30 //发送请求,此时状态码为2
31 xhr.send(null);32 });33
34 })35
36
37
38
39
40 用户名:
41
42
43