Ajax 是一种在无需从新加载整个网页的状况下,可以更新部分网页的技术。php
Ajax的全称是Asynchronous JavaScript and XML,即异步JavaScript+XML。它并非新的编程语言,而是几种原有技术的结合体。它由如下几种技术组合而成,包括:html
实际上,在Ajax解决方案中这些技术都是可用的,不过只有三种是必须的:HTML/XHTML、DOM以及JavaScript。web
当须要异步与服务器交换数据时,须要XMLHttpRequest对象来异步交换。XMLHttpRequest对象的主要属性有:ajax
对于readyState的状态值,其中“0”状态是在定义后自动具备的状态值,而对于成功访问的状态(获得信息)咱们大多数采用“4”进行判断。数据库
Ajax的核心就是是JavaScript对象XmlHttpRequest,这个对象为向服务器发送请求和解析服务器响应提供了流畅的接口。XmlHttpRequest可使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。编程
XHR对象由IE5率先引入,在IE5中XHR对象是经过MSXML库中一个ActiveX对象实现的,根据IE版本不一样可能会遇到不一样版本XHR对象,而IE7+与其它现代浏览器均支持原生的XHR对象,在这些浏览器中咱们只需使用XMLHttpRequest构造函数就能够构造XHR对象,所以一个浏览器兼容的建立XHR对象的函数写法大概是这个样子:浏览器
1 var xmlhttp; 2 if (window.XMLHttpRequest) { 3 // code for IE7+, Firefox, Chrome, Opera, Safari 4 xmlhttp=new XMLHttpRequest(); 5 } else { 6 // code for IE6, IE5 7 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 8 }
XMLHttpRequest对象有两个重要方法 open与send。缓存
1 xmlhttp.open("GET","ajax_info.txt",true); 2 xmlhttp.send();
对于open方法,有几点须要注意:安全
真正可以向服务器发送请求须要调用send方法,并仅在POST请求能够传入参数,不须要则发送null,在调用send方法以后请求被发往服务器。 服务器
请求发往服务器,服务器根据请求生成响应(Response),传回给XHR对象,在收到响应后相应数据会填充到XHR对象的属性,有四个相关属性会被填充:
在收到响应后第一步是检查响应状态,确保响应是否成功返回(状态为200)。
1 xhr.open('get','default.aspx,false'); //准备同步请求 2 xhr.send(); 3 if(xhr.status>=200 && xhr.status<300 || xhr.status==304){ 4 //do something 5 }else{ 6 //error handler 7 }
上面代码在发送同步请求的时候没问题,只有获得响应后才会执行检查status语句,可是在异步请求时,JavaScript会继续执行,不等生成响应就检查状态码,这样咱们不能保证检查状态码语句是在获得响应后执行(实际上也几乎不可能,服务器再快一个HTTP请求也不会快过一条JavaScript执行数度),这时候咱们能够检查XHR对象的readyState属性,该属性表示请求/响应过程当中的当前活动阶段,每当readyState值改变的时候都会触发一次onreadystatechange事件。
咱们能够利用这个事件检查每次readyState变化的值,当为4的时候表示全部数据准备就绪,有一点咱们须要注意:必须在open方法以前指定onreadtstatechange事件处理程序。
1 xmlhttp.onreadystatechange=function(){ 2 if (xmlhttp.readyState==4 && xmlhttp.status==200){ 3 document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 4 } 5 } 6 xmlhttp.open("GET","/try/ajax/ajax_info.txt",true); 7 xmlhttp.send();
与 POST 相比,GET 更简单也更快,而且在大部分状况下都能用。
然而,在如下状况中,请使用 POST 请求:
一个简单的 GET 请求:
xmlhttp.open("GET","demo_get.html",true); xmlhttp.send();
在上面的例子中,可能获得的是缓存的结果。
为了不这种状况,向 URL 添加一个惟一的 ID:
xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true); xmlhttp.send();
若是但愿经过 GET 方法发送信息,向 URL 添加信息:
xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true); xmlhttp.send();
一个简单 POST 请求:
xmlhttp.open("POST","demo_post.html",true); xmlhttp.send();
若是须要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。而后在 send() 方法中规定您但愿发送的数据:
xmlhttp.open("POST","ajax_test.html",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford");
open() 方法的 url 参数是服务器上文件的地址:
xmlhttp.open("GET","ajax_test.html",true);
该文件能够是任何类型的文件,好比 .txt 和 .xml,或者服务器脚本文件,好比 .asp 和 .php (在传回响应以前,可以在服务器上执行任务)。
XMLHttpRequest 对象若是要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:
xmlhttp.open("GET","ajax_test.html",true);
对于 web 开发人员来讲,发送异步请求是一个巨大的进步。不少在服务器执行的任务都至关费时。AJAX 出现以前,这可能会引发应用程序挂起或中止。
经过 AJAX,JavaScript 无需等待服务器的响应,而是:
当使用 async=true 时,规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:
xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send();