一、简介
AJAX 即 “Asynchronous JavaScript and XML ”( 异步 JavaScript 和 XML) ,AJAX 并非缩写词 , 而是由 Jesse James Gaiiett 创造的名词 , 是指一种创建交互式 网页 应用的网页开发技术。
二、同步和异步的区别
同步 :提交请求 -> 等待服务器处理 -> 处理完毕返回这个期间客户端浏览器不能干任何事
同步是指:发送方发出数据后,等接收方发回响应以后才发下一数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数 据包的通讯方式
三、AJAX原理
1. Ajax 的核心是 JavaScript 对象 XmlHttpRequest
2. AJAX 采用异步交互过程
AJAX 引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流。现在,可以用Javascript 调用 AJAX 引擎来代替产生一个 HTTP 的用户动作,内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给 AJAX 来执行
3.XMLHttpRequest 对象
创建 XMLHttpRequest 对象(由于非标准所以实现方法不统一)
(1)Internet Explorer 把 XMLHttpRequest 实现为一个 ActiveX 对象
(2) 其他浏器 (Firefox 、 Safari 、 Opera …) 把它实现为一个本地JavaScript 对象。、(3)XMLHttpRequest 在不同浏览器上的实现是兼容的,所以可以用同样的方式访问 XMLHttpRequest 实例的属性和方法,而不论这个实例创建的方法是什么。
var xmlhttp = null; var url = "/cgi-bin/_cgi2.cgi?"; url += sendData; if (window.XMLHttpRequest) {// code for IE7+,Firefox,Chrome,Opera,Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6,IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
4.XMLHttpRequest 对象方法
方法
描述
abort()
停止当前请求
getAllResponseHeaders()
把 http 请求的所有响应首部作为键 / 值对返回
getResponseHeader("headerLabel")
返回指定首部的串值
open(method,url,async)
规定请求的类型、 URL 以及是否异步处理请求。
method : 请求的类型; GET 或 POST
url : 文件在服务器上的位置
async :true ( 异步)或 false(同步)
send(content)
向服务器发送请求
setRequestHeader("label","value")
把指定首部设置为所提供的值。在设置任何首部之前必须先调用 open()
5.XMLHttpRequest 对象属性
描述
onreadystatechange
readyState
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪status
responseText
获得字符串形式的响应数据。
responseXML
获得 XML 形式的响应数据
四、发送请求方法与属性的介绍
利用 XMLHttpRequest 实例与服务器进行通信包含以下 3 个关键部分
在 Ajax 执行过程中,服务器会通知客户端当前的通信状态。这依靠更新 XMLHttpRequest 对象的readyState 来实现,改变 readyState属性是服务器对客户端连接操作的一种方式。
注意:每次 readyState 属性的改变都会触发 readystatechange 事件
(3).send(data)
data :将要传递给服务器的字符串。
若选用的是 GET 请求 , 则不会发送任何数据 , 给 send 方法传递 null 即可 :xmlhttp.send(null)
当向 send() 方法提供参数时,要确保 open() 中指定的方法是 POST ,如果没有数据作为请求体的一部分发送,则使用 null.
(5) 发送请求get 与post 的区别总结
发送请求 : 如果是get 请求send( 参数) 参数:必须是null 或者xmlhttp.send();
get 请求就不必要设置 xhr.setRequestHeader(header,value)
备注:如果xhr.send( 参数); 参数不为空情况下,会自动转换成post 请求方式 您可以通过request.getMethod(); 方法获取请求的方式
发送请求 : 如果是post 请求send( 参数) 参数:参数可以是null 或 者xhr.send()|send( 带有参数的)post 请求在传递值的情况下必须 设置 xhr.setRequestHeader(header,value)
(2) .open(method,asynch)
method : 请求类型,类似 “ GET ” 或” POST ” 的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用 GET( 可以在 GET 请求里通过附加在 URL 上的查询字符串来发送数据,不过数据大小限制为 2000 个字符 ) 。若需要向服务器发送数据,用 POST 。
url : 路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。
asynch : 表示请求是否要异步传输,默认值为 true( 异步 ) 。指定 true ,在读取后面的脚本之前,不需要等待服务器的相应。指定 false ,当脚本处理过程经过这点时,会停下来,一直等到 Ajax 请求执行完毕再继续执行。
在某些情况下,有些浏览器会把多个 XMLHttpRequest 请求的结果缓存在同一个 URL 。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到 URL 的最后,就能确保 URL 的惟一性,从而避免浏览器缓存结果 。
(4).setRequestHeader(header,value)
参数 header : 首部的名字
参数 value : 首部的值
如果用 POST 请求向服务器发送数据 , 需要将 “Content-type ” 的首部设置为 “application/x-www-form-urlencoded ” 它会告知服务器正在发送数据 , 并且数据已经符合 URL 编码了。
五、实例
function xmlhttpfun() { var xmlhttp = null; if (window.XMLHttpRequest) {// code for IE7+,IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } /* 建立对服务器的请求 GET: 通过"GET"方法,还有"POST" ajax_demo.txt: url路径,相对路径或者绝对路径 true,异步;false,同步 */ xmlhttp.open("GET","ajax_demo.txt",true); xmlhttp.setRequestHeader("If-Modified-Since","0");// xmlhttp.send(); // 向服务器发送请求,先open(),才能再调用send(); }