一、什么是Ajax
Ajax全称Asynchronous Javascript And XMl)异步Javascript和XML,即使用Javascrip语言与服务器进行异步交互,传输的数据为XML(不一定只是XML,可以是PHP、文本、json等)。
Ajax简单原理:通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
Ajax:客户端与服务器,可以在【不刷新整个页面】的情况下,与服务器进行异步通讯的技术
- 异步:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求。
- 同步:客户端发出一个请求后,无需等待服务器响应结束,就能发出第二个请求
二、为什么我们需要Ajax
在我们之前的开发中,每当用户向服务器发送请求,哪怕只需要更新一点点的局部内容,服务器都会将整个页面进行刷新。这样会导致以下问题:
- 性能会有所降低,刷新整个页面,需要耗费时间较长
- 用户的在页面中的操作会被中断,影响用户体验
三、Ajax使用场景
-
普通的文本输入提示和自动完成的场景
-
用Ajax进行数据验证(判断用户名是否已经存在的提示)
-
用Ajax自动更新页面: 通过Ajax引擎在后台进行定时轮询,向服务器发送请求,查看是否有最新数据,若有则将最新数据(不是所有数据)下载并在页面上进行动态更新,通过JavaScript等方式通知用户)
四、Ajax优缺点
1、优点
- 异步交互:增加用户体验感
- 性能:因为服务器不需要响应整个页面,只需响应部分内容,较少了服务器的压力
2、缺点
- 无端的增加对服务器的访问次数,给服务器增加了很多压力
- ajax干掉了back按钮,即对浏览器后退机制的破坏
- 开发者在不经意间会暴露比以前更多的数据和服务器逻辑
- 对搜索引擎的支持比较弱
- 破坏了程序的异常机制
- 违背了url和资源定位的初衷
- 一些手持设备(如手机、PDA等)现在还不能很好的支持ajax,如手机的浏览器上打开采用ajax技术的网站时,它目前是不支持的
四、XMLHttpRequest对象
Ajax最重要的一个对象就是XMLHTTPRequest
对象。
1、XMLHttpRequest工作原理
当我们使用AJAX之后,浏览器是先把请求发送到XMLHttpRequest异步对象之中,异步对象对请求进行封装,然后再与发送给服务器。服务器并不是以转发的方式响应,而是以流的方式把数据返回给浏览器
XMLHttpRequest异步对象会不停监听服务器状态的变化,得到服务器返回的数据,就写到浏览器上
2、创建XMLHttpRequest对象
要创建XMLHttpRequest对象是要分两种情况考虑的:
- 在IE6以下的版本
- 在IE6以上的版本以及其他内核的浏览器(Mozilla)等
<script type="text/javascript">
var xhttp;
if(window.XMLHttpRequest) {
// 在IE6以上的版本以及其他内核的浏览器(Mozilla)等
xhttp = new XMLHttpRequest();
}else if(window.ActiveXObject) {
// 在IE6以下的版本
xhttp = new ActiveXObject();
}
</script>
3、XMLHttpRequest对象的属性和方法
方法
常用的已加粗
- open() (String method,String url,boolean asynch,String username,String password)
xhttp.open("GET", "xxxx.txt", true):用于创建与服务器的http连接
第一个参数:指定提交方式(post、get)
第二个参数:指定服务器(文件)位置
第三个参数:指定是同步还是异步(true异步,false同步)
第四五个参数:在http认证的时候会用到(可选)
- send(content)
xhttp.send(content):用于发送请求给服务器
content:如果是get方法,不需要填写参数,或填写null
content:如果是post方法,把要提交的参数写上去
- setRequestHeader(String header,String value)
xhhtp.setRequestHeader():设置消息头(使用post方式才会使用到,get方法并不需要调用该方法)
-
getAllResponseHeaders():返回所有来自服务器响应的头部信息
-
getResponseHeader(String header):返回来自服务器响应的特定头部信息
-
abort()
属性
常用的已加粗
- onreadystatechange
请求状态改变的事件触发器(readyState变化时会调用此方法),一般用于指定回调函数
- readyState:请求状态readyState一改变,回调函数被调用,它有5个状态
0:未初始化
1:open方法成功调用以后
2:服务器已经应答客户端的请求
3:交互中,Http头信息已经接收,响应数据尚未接收。
4: 请求已完成且响应已就绪
- status:服务器返回的状态码
完整列表Http 消息参考手册
200: "OK"
403: "Forbidden"
404: "Page not found"
- responseText:服务器返回的文本内容
- responseXML:服务器返回的兼容DOM的XML内容
- statusText:服务器返回状态码的文本信息
五、Ajax实例
六、问题
1、XMLHttpRequest缓存问题
- 产生缓存的原因就是:我们请求了同一个地址,做了相同的操作。服务端认为我的操作并没有什么变化,就直接把缓存的信息给我了。
- 解决:
- 在每次请求url中加入一个时间戳参数【每次url就不一样了】
- 加入时间戳参数到url时,也分两种情况
- url本身就带有参数了,也就是说有"?"号了,那么添加时间戳的时候就需要用"&"号
- url没有参数,直接使用"?"号来添加时间戳
if(url.indexOf("?") >= 0){ url = url + "&t=" + (new Date()).valueOf(); } else{ url = url + "?t=" + (new Date()).valueOf(); }
2、POST请求怎么处理
一般只有我们发送请求的时候带有参数,才需要使用Post请求。
- 首先我们在使用
xhttp.open()
方法的时候添加的参数应该改为POST
。 - 其次我们发送请求
xhhtp.send()
的时候,参数应该填写,而且不是null - 这个时候呢,我们要添加一步:设置Content-Type请求头:
xhttp.open("POST","xxx.txt",true)
xhttp.setRequestHeader("Contnet-Type","application/x-www-form-urlencoded");
xhttp.send("fname=zhangsan&psd=123")