Ajax工作原理
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) 1(已初始化):对象已经初始化,还没有调用send方法 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用来保存即
2. 利用XMLHttpRequest对象发送简单请求 如上所示,首先检查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的安全漏洞等。 3、对搜索引擎的支持比较弱。 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=utf-8,%3Cp%20class%3D%22MsoNormal%22%20style%3D%22color%3A%20rgb(68%2C%2068%2C%2068)%3B%20font-famil… 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对象的属性和方法实现页面的不完全刷新。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |