Ajax工作原理简单来说,就是通过XmlHttpRequest 来向服务器发送异步请求,然后获取数据,Javascript操作DOM更新页面。
XmlHttpRequest是Ajax的关键技术,也就是通过它来达到向服务器发送异步请求并获取数据进行处理,而不阻塞用户,达到无刷新的效果。是一种支持异步请求的技术。
XmlHttpRequest的属性有:
1.onreadystatechange:每次状态改变所触发事件的事件处理程序
2.responseXML:从服务器返回数据的DOM兼容的数据格式
3.responseText:从服务器返回数据的字符串形式
4.status:从服务器返回的数字代码,如404 ,200
5.status text:伴随状态码的字符串信息
6.readyState:对象状态值
0(未初始化):对象已建立,但是并未初始化(尚未调用open)
2(发送数据):send方法已经调用,但是当前状态和http头未知
3(数据传送中):已接收部分数据,但是因为响应和http头不全,所以调用responseTest和responseXml获取数据出错
4(完成):数据发送完成,这时调用responseTest和responseXml获取完整数据
由于浏览器之间的差异,所以创建XMLHttpRequest之间存在着差别。但是差别主要体现在ie和非ie得浏览器之间。
function CreateXmlHttp() { //非IE浏览器创建XMLHttpRequest对象 if (window.XmlHttpRequest) { xmlhttp = new XmlHttpRequest(); } //IE浏览器创建XMLHttpRequest对象 if (window.ActiveXObject) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("msxml2.XMLHTTP"); } catch (ex) { } } } } function Ustbwuyi() { var data = document.getElementById("username").value; CreateXmlHttp(); if (!xmlhttp) { alert("创建XMLhttp对象异常!"); return false; } xmlhttp.open("POST",url,false); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { document.getElementById("user1").innerHTML = "数据正在加载..."; if (xmlhttp.status == 200) { document.write(xmlhttp.responseText); } } } xmlhttp.send(); }
可以看出,创建XMLHttpRequest对象相当容易。首先,声明一个全局变量xmlHttp用来保存即
将创建的XMLHttpRequest对象的引用;然后,在createXMLHttpRequest()方法中完成具体创建
工作。因为IE与其他浏览器对XMLHttpRequest 对象的实现方法不同,因此在创建时,通过一
个分支语句进行判断。如果window.ActiveXObject调用返回true,则证明为IE浏览器,那么就
通过传递“Microsoft.XMLHTTP”给ActiveXObject()来创建XMLHttpRequest对象,否则就把
XMLHttpRequest实现为本地JavaScript对象。XMLHttpRequest对象在不同浏览器上的实现是兼
容的,所以可以用同样的方法访问XMLHttpRequest的方法和属性。
2. 利用XMLHttpRequest对象发送简单请求
创建了XMLHttpRequest对象,并了解了XMLHttpRequest对象的方法和属性之后,让我们来
看看怎样利用XMLHttpRequest对象发送简单的请求。利用XMLHttpRequest对象发送简单请求的
基本步骤如下:
1) 创建XMLHttpRequest对象实例。
2) 设定XMLHttpRequest对象的回调函数,利用onreadystatechange属性。
3) 设定请求属性:设定HTTP方法(GET或POST);设定目标URL。利用open()方法。
4) 将请求发送给服务器。利用send()方法。
3. 利用DOM对服务器响应进行处理
前面已经设置了回调函数,回调函数正是用来处理服务器响应信息的。但是,别忘了我们
的最终目的:解决页面完全刷新和缺乏交互性的问题。在服务器对我们的请求信息作出响应
后,我们就得实现页面的无缝更新(就是无闪烁的更新信息)。要实现这一点,那么就不得不
提到DOM了。
DOM(Document Object Model),文档对象模型,是以面向对象方式描述页面文档的对象
模型。DOM中定义了,与平台和语言无关的,用来表示和修改文档所需的对象、以及这些对象
的属性和方法。通过DOM,我们可以把页面上的数据和结构抽象成一个树型表示,进而可以通
过DOM中定义的属性和方法对文档进行操作,如遍历、编辑等。
这样,服务器相应信息就可以通过DOM的方法和属性,动态的更新到页面的相应节点。
从而使用户感觉不到刷新过程的存在,提高了交互性。
如上所示,首先检查XmlHttpRequest的整体状况(readystatus=4)确保它已经完成,即数据已经发送完毕。然后根据服务器的设定询问请求状态(status=200),然后就执行下面需要的操作。
XmlHttpRequest的两个方法send()和open(),open()方法指定了:
1.向服务器提交数据的类型,即post还是get
2,请求的url还有传递的数据
3.传输的方式,false为同步,true为异步。如果是异步方式,客户端就不需要等待服务器的响应。如果是同步,客户端需要等待服务器端的响应再进行下面的操作。这要根据实际的业务需求,有时客户端会一次发送多个请求,后面的请求可能会覆盖前面,所以这时就需要指定同步。
send用来发送请求。
ajax的优点
Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点:
1、最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
2、使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
ajax的缺点
下面我着重讲一讲ajax的缺陷,因为平时我们大多注意的都是ajax给我们所带来的好处诸如用户体验的提升。而对ajax所带来的缺陷有所忽视。
下面所阐述的ajax的缺陷都是它先天所产生的。
1、ajax干掉了back按钮,即对浏览器后退机制的破坏。后退按钮是一个标准的web站点的重要功能,但是它没法和js进行很好的合作。这是ajax所带来的一个比较严重的问题,因为用户往往是希望能够通过后退来取消前一次操作的。那么对于这个问题有没有办法?答案是肯定的,用过Gmail的知道,Gmail下面采用的ajax技术解决了这个问题,在Gmail下面是可以后退的,但是,它也并不能改变ajax的机制,它只是采用的一个比较笨但是有效的办法,即用户单击后退按钮访问历史记录时,通过创建或使用一个隐藏的IFRAME来重现页面上的变更。(例如,当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态。)
但是,虽然说这个问题是可以解决的,但是它所带来的开发成本是非常高的,和ajax框架所要求的快速开发是相背离的。这是ajax所带来的一个非常严重的问题。
2、安全问题
技术同时也对IT企业带来了新的安全威胁,ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、sql注入攻击和基于credentials的安全漏洞等。
4、破坏了程序的异常机制。至少从目前看来,像ajax.dll,ajaxpro.dll这些ajax框架是会破坏程序的异常机制的。关于这个问题,我曾经在开发过程中遇到过,但是查了一下网上几乎没有相关的介绍。后来我自己做了一次试验,分别采用ajax和传统的form提交的模式来删除一条数据……给我们的调试带来了很大的困难。
5、另外,像其他方面的一些问题,比如说违背了url和资源定位的初衷。例如,我给你一个URL地址,如果采用了ajax技术,也许你在该URL地址下面看到的和我在这个URL地址下看到的内容是不同的。这个和资源定位的初衷是相背离的。
6、一些手持设备(如手机、PDA等)现在还不能很好的支持ajax,比如说我们在手机的浏览器上打开采用ajax技术的网站时,它目前是不支持的,当然,这个问题和我们没太多关系。
下面是一个完整的例子:<html> <head> <title>Ajax应用实例</title> <script type="text/javaScript"> var xmlHttp; var requestType=""; function createXMLHttpRequest(){ if(window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } } function startRequest(theRequestType){ requestType = theRequestType; createXMLHttpRequest(); xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET","Response.xml",true); xmlHttp.send(null); } function myCallback(){ if(xmlHttp.readyState==4){ if(xmlHttp.status==200){ if(requestType=="all") listAll(); else if(requestType=="north") listnorth(); } } } function listAll(){ var xmlDoc = xmlHttp.responseXML; var allProvs = xmlDoc.getElementsByTagName("prov"); outputList("all",allProvs); } function listnorth(){ var xmlDoc = xmlHttp.responseXML; var north = xmlDoc.getElementsByTagName("north")[0]; var northProvs = north.getElementsByTagname("prov");2014/12/30 AJAX原理 data:text/html;charset=utf8,%3Cp%20class%3D%22Msonormal%22%20style%3D%22color%3A%20rgb(68%2C%2068%2C%2068)%3B%20fontfamil… 2/2 outputList("north",northProvs); } function outputList(title,provs){ var out=title; var currentProv = null; for(var i=0;i<provs.length;i++){ currentProv = provs[i]; out = out + “<br/>” + currentProv.childNodes[0].nodeValue; } document.getElementById(title).innerHTML = out; } </script> </head> <body> <h1> Ajax应用实例</h1> <form action="#"> <input type="button" value="列出所有沿海省市" conclick="startRequest('all'); "/> <div id="all"></div> <input type="button" value="列出江北沿海省市" conclick="startRequest('north'); "/> <div id="north"></div> </form> </body> </html> <!--Response.xml----------------------------------------------------------> <?xml version="1.0"encoding="utf-8" ?> <provs> <north> <prov>辽宁</prov><prov>河北</prov><prov>天津</prov> <prov>山东</prov><prov>江苏</prov> </north> <south> <prov>浙江</prov><prov>福建</prov><prov>广东</prov> <prov>广西</prov><prov>海南</prov><prov>上海</prov> <prov>台湾</prov><prov>香港</prov><prov>澳门</prov> </south> </provs>其实原理很简单,Ajax通过javascript创建XMLHttpRequest对象吗,然后通过javascript调用这个对象实现和服务器的异步通信,然后javascript调用DOM对象的属性和方法实现页面的不完全刷新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。