AJAX相关
大学时的笔记,整理一下备忘 1 ajax的缺点 A:ajax通信常常是一个数据片段,例如,xml.html片段,或者纯文本,这些信息不是完整的html文档,而且通过后台来异步获取,不能被搜索引擎发现并缓存. B:ajax将大量的运算从服务器端转移到了客户端,意味着浏览器将承受更大的负担,不再是简单的文档显示。ajax中的核心语言是javascript,作为一门解释型的脚本语言,其运行效率不是很高.而且依赖不同的浏览器实现 参考文档: http://hi.baidu.com/renxian/item/ec39f881bd65875d840fabe2http://www.cn-java.com/www1/?action-viewnews-itemid-10528 2全面剖析XMLHttpRequest对象 AXMLHttpRequest对象的属性和事件 readyState属性
onreadystatechange事件 无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件。其中,onreadystatechange属性接收一个EventListener值-向该方法指示无论readyState值何时发生改变,该对象都将激活。 responseText属性 这个responseText属性包含客户端接收到的HTTP响应的文本内容。当readyState值为0、1或2时,responseText包含一个空字符串。当readyState值为3(正在接收)时,响应中包含客户端还未完成的响应信息。当readyState为4(已加载)时,该responseText包含完整的响应信息。 responseXML属性 此responseXML属性用于当接收到完整的HTTP响应时(readyState为4)描述XML响应;此时,Content-Type头部指定MIME(媒体)类型为text/xml,application/xml或以+xml结尾。如果Content-Type头部并不包含这些媒体类型之一,那么responseXML的值为null。无论何时,只要readyState值不为4,那么该responseXML的值也为null。 其实,这个responseXML属性值是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分析(例如,如果文档不是良构的或不支持文档相应的字符编码),那么responseXML的值将为null。 status属性 这个status属性描述了HTTP状态代码,而且其类型为short。而且,仅当readyState值为3(正在接收中)或4(已加载)时,这个status属性才可用。当readyState的值小于3时试图存取status的值将引发一个异常。 statusText属性 这个statusText属性描述了HTTP状态代码文本;并且仅当readyState值为3或4才可用。当readyState为其它值时试图存取statusText属性将引发一个异常。 BXMLHttpRequest对象的方法 abort()方法 C 发送请求 <script type="text/javascript"> function sendRequest(){ var xmlHttpReq=init(); function init(){ if (window.XMLHttpRequest) { return new XMLHttpRequest(); } else if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); } } </script> var catalogId=encodeURIComponent(document.getElementById("catalogId").value); xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true); xmlHttpReq.onreadystatechange=processRequest;D处理请求 function processRequest(){ if(xmlHttpReq.readyState==4){ if(xmlHttpReq.status==200){ processResponse(); } } } var msg=xmlHttpReq.responseXML; 参考文档:http://dev.yesky.com/91/2687091.shtml 3http请求状态及其含义
4AJAX核心对象-- XMLHttpRequest 对象使用详解 获取xmlhttpRequest对象 <script language="javascript" type="text/javascript"> var request; function createRequest() { try { request = new XMLHttpRequest(); } catch (trymicrosoft) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (failed) { request = false; } } } if (!request) alert("Error initializing XMLHttpRequest!"); } function getCustomerInfo() { createRequest(); // Do something with the request variable } </script> 创建一个新变量 request 并赋值 false。使用 false 作为判断条件,它表示还没有创建 XMLHttpRequest 对象。 ·增加 try/catch 块:1、尝试创建 XMLHttpRequest 对象。 2、如果失败(catch (trymicrosoft)): 1) 尝试使用较新版本的 Microsoft 浏览器创建 Microsoft 兼容的对象(Msxml2.XMLHTTP)。 2) 如果失败(catch (othermicrosoft))尝试使用较老版本的 Microsoft 浏览器创建 Microsoft 兼容的对象(Microsoft.XMLHTTP)。 3) 如果失败(catch (failed))则保证 request 的值仍然为 false。 ·检查 request 是否仍然为 false(如果一切顺利就不会是 false)。 ·如果出现问题(request 是 false)则使用 JavaScript 警告通知用户出现了问题。 open方法 function getCustomerInfo() { var phone = document.getElementById("phone").value; var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone); request.open("GET",url,true); }回调方法 function updatePage() { if (request.readyState == 4) if (request.status == 200) alert("Server is done!"); else if (request.status == 404) alert("Request URL does not exist"); else alert("Error: status code is " + request.status); } 参考文档: http://www.cnblogs.com/meil/archive/2006/09/21/510794.html http://www.cnblogs.com/meil/archive/2006/09/21/510799.html 5 AJAX的中文问题 A发送路径中的参数有中文,在服务器段接收参数值是乱码' var url="a.jsp?name=小李"; xmlHTTP.open ("post",true);解决方法: 客户端: var url="a.jsp?name=小李"; url=encodeURI(url); url=encodeURI(url); //两次,很关键 //var url="a.jsp?name=escape("小李")"; xmlHTTP.setrequestheader("cache-control","no-cache"); xmlHTTP.setrequestheader("Content-Type","application/x-www-form-urlencoded"); xmlHTTP.setrequestheader("contentType","text/html;charset=uft-8")//指定发送数据的编码格式 xmlHTTP.open ("post",true);服务器端: String name = request.getParameter("name"); name = java.net.URLDecoder.decode(name,"UTF-8");B 返回来的responseText或responseXML的值中含有中文是乱码 原因:AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。 response.setContentType("text/text;charset=UTF-8");//返回的是txt文本文件 或是
response.setContentType("text/xml;charset=UTF-8");//返回的xml文件 总结:1)ajax提交数据的格式默认为utf-8,利用javascript的提供的escape()或encodeURI()方法.在服务器端接收的时候要使用java.net.URLDecoder.decode("","UTF-8")方法进行解码. 2)xtmlhttp 返回的数据默认的字符编码是utf-8,所以服务器要向客户端发送数据的时候,也要采用utf-8编码 参考文档:http://www.blogjava.net/hulizhong/archive/2007/04/21/112416.html 6重构的xmlhttpRequest调用的使用方法 var net=new Object(); net.READY_STATE_UNINITIALIZED=0; net.READY_STATE_LOADING=1; net.READY_STATE_LOADED=2; net.READY_STATE_INTERACTIVE=3; net.READY_STATE_COMPLETE=4; /*--- content loader object for cross-browser requests ---*/ net.ContentLoader=function(url,onload,onerror,method,params,contentType){ this.req=null; this.onload=onload; this.onerror=(onerror) ? onerror : this.defaultError; this.loadXMLDoc(url,contentType); } net.ContentLoader.prototype.loadXMLDoc=function(url,contentType){ if (!method){ method="GET"; } if (!contentType && method=="POST"){ contentType='application/x-www-form-urlencoded'; } if (window.XMLHttpRequest){ this.req=new XMLHttpRequest(); } else if (window.ActiveXObject){ this.req=new ActiveXObject("Microsoft.XMLHTTP"); } if (this.req){ try{ var loader=this; this.req.onreadystatechange=function(){ net.ContentLoader.onReadyState.call(loader); } this.req.open(method,true); if (contentType){ this.req.setRequestHeader('Content-Type',contentType); } this.req.send(params); }catch (err){ this.onerror.call(this); } } } net.ContentLoader.onReadyState=function(){ var req=this.req; var ready=req.readyState; var httpStatus=req.status; if (ready==net.READY_STATE_COMPLETE){ if (httpStatus==200 || httpStatus==0){ this.onload.call(this); }else{ this.onerror.call(this); } } } net.ContentLoader.prototype.defaultError=function(){ alert("error fetching data!" +"/n/nreadyState:"+this.req.readyState +"/nstatus: "+this.req.status +"/nheaders: "+this.req.getAllResponseHeaders()); } 本质上就是以OO的方式构造了一个net对象,通过它来实现AJAX调用,构造函数必需的就两个参数:URL和回调函数(也就是你要处理服务器返回文档的函数),其他就是参数,方法,返回类型等。 使用方法如下:<script type='text/javascript' src='ContentLoader.js'></script> <script type='text/javascript'> window.onload=function(){ var loader1=new net.ContentLoader("data.txt",displayResult); } function displayResult(){ var tmp=document.getElementById("hello"); var txt=this.req.responseText; alert(txt); var childEl=document.createElement("div"); var textNode=document.createTextNode(txt); childEl.appendChild(textNode); tmp.appendChild(childEl); } </script> <div id="hello"></div>此例中的回调函数就是displayResult()方法,url为同个文件夹下面的data.txt,很简单的例子,显示data.txt中的内容。 总结一下,本博客主要介绍了ajax的优缺点,以及xmlHttprequest的一些属性和方法,另外介绍了ajax中中文乱码的解决方案。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |