一ajax的基本原理
1创建XmlHttpRequest对象。
2创建请求。
3根据监控的readyState值的变化实现当服务器返回数据时调用回调函数。
4发送请求
5接收服务器返回的数据(该步骤可以和会和步骤3合并)
二ajax使用基本流程
ajax的使用主要是实现上面的原理图。
1创建XMLHttpRequest对象,由于这段代码是固定的夜视第一步,所以我们一般将其封装为一个函数createXMLHttpRequest();
function createXMLHttpRequest(){ var request; if(window.XMLHttpRequest){//火狐 request= new XMLHttpRequest(); }else if{ request = new ActiveXObject("Msxml2.XMLHTTP");//IE } return request; }
2使用XMLHttpRequest对象创建请求
var req=createXMLHttpRequest(); req.open("get","testAjaxServlet");
3监视response状态,写回调函数处理服务器返回的数据
(1)服务端响应
(2)XMLHttpRequest的readyState
req.onreadystatechange=function(){ if(req.ready==4){ var result=request.responseTest;//得到服务端返回的数据 document.getElementById("div2").innerHTML=result;//js操作DOM将数据写到页面对象中,实现局部刷新 } }
注:上述代码仅仅是一个实例,说明了在什么状态下接受数据,显示数据
4使用XMLHttpRequest对象发送请求
req.send(null);//如果不写null,火狐会报错
三ajax的传参方式和接受数据的方式
注:由于开发需要,传参方式和接受数据的形式会不同,接下来重点讨论
1两种传参方式post和get
get方式:更简单也更快,并且在大部分情况下都能用,容易被缓存(因为是小数据)
post方式:
2ajax接受数据的方式
(1)普通文本数据
req.responseTest得到返回的文本数据
(2)XML数据
1)处理
a)服务端
response.setContentType("test/xml;charset=utf-8");//通过ajax写xml数据最好使用utf-8 response.getWriter().println("<resume><name>朱元璋</name></resume>");
b)客户端
req.responseXML.getElementsByTagName("name")[0].firstChild.data;
2)评价
a)优势
1xml数据通用。有很多编辑、解析工具
2xml标记有属性、以及xml命名空间等,从而写出非常通用的程序。
b)劣势
1js解析xml的难度较大,尤其是在浏览器差异方面。
2xml数据经常有冗余现象。
(3)JSON(javascriptobjectnative)
1)处理
a)servlet中
sb.append("{name:'朱元璋',age:'32',job:'皇帝'}"); sb.append("[{age:1,name:'a'},{age:2,name:'b'},{age:3,name:'c'}]");//作为对象数组返回
b)浏览器端
var a=req.responseTest; eval("var c="+a);//利用eval函数将返回的文本转化成js对象
2)评价
a)优势
1解析容易,经过eval执行后直接解析为js对象,不需要经过其他中间步骤
2可以表达比较复杂的数据组织关系
3甚至可以通过json方式直接执行服务器端传来的js函数
b)劣势
1xml属性和命名空间不能直接处理
四ajax实例
2googlesuggest功能
3ajax三级联动
4拖曳效果实现购物车
5ajax树结构
6ajax面板效果
五ajax类库的封装
工具类:AjaxUtil.js
var AjaxUtil = { // 基础选项 options : { method : "get",// 默认提交的方法,get post url : "",// 请求的路径 required params : {},// 请求的参数 type : 'text',// 返回的内容的类型,text,xml,json callback : function() { }// 回调函数 required },// 创建XMLHttpRequest对象 createRequest : function() { var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");// IE6以上版本 } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// IE6以下版本 } catch (e) { try { xmlhttp = new XMLHttpRequest(); if (xmlhttp.overrideMimeType) { xmlhttp.overrideMimeType("text/xml"); } } catch (e) { alert("您的浏览器不支持Ajax"); } } } return xmlhttp; },// 设置基础选项 setOptions : function(newOptions) { for ( var pro in newOptions) { this.options[pro] = newOptions[pro]; } },// 格式化请求参数 formateParameters : function() { var paramsArray = []; var params = this.options.params; for ( var pro in params) { var paramValue = params[pro]; paramsArray.push(pro + "=" + paramValue); } return paramsArray.join("&"); },// 状态改变的处理 readystatechange : function(xmlhttp) { // 获取返回值 var returnValue; if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { switch (this.options.type) { case "xml": returnValue = xmlhttp.responseXML; break; case "json": var jsonText = xmlhttp.responseText; if(jsonText){ returnValue = eval("(" + jsonText + ")"); } break; default: returnValue = xmlhttp.responseText; break; } if (returnValue) { this.options.callback.call(this,returnValue); } else { this.options.callback.call(this); } } },// 发送Ajax请求 request : function(options) { var ajaxObj = this; // 设置参数 ajaxObj.setOptions.call(ajaxObj,options); // 创建XMLHttpRequest对象 var xmlhttp = ajaxObj.createRequest.call(ajaxObj); // 设置回调函数 xmlhttp.onreadystatechange = function() { ajaxObj.readystatechange.call(ajaxObj,xmlhttp); }; // 格式化参数 var formateParams = ajaxObj.formateParameters.call(ajaxObj); // 请求的方式 var method = ajaxObj.options.method; var url = ajaxObj.options.url; if ("GET" === method.toUpperCase()) { url += "?" + formateParams; } // 建立连接 xmlhttp.open(method,url,true); if ("GET" === method.toUpperCase()) { //发送请求 xmlhttp.send(null); } else if ("POST" === method.toUpperCase()) { // 如果是POST提交,设置请求头信息 xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //发送请求 xmlhttp.send(formateParams); } } };
使用实例
function findUser() { var userid = $("userid").value; if (userid) { AjaxUtil.request({ url:"servlet/UserJsonServlet",params:{id:userid},type:'json',callback:process }); } } function process(json){ if(json){ $("id").innerHTML = json.id; $("username").innerHTML = json.username; $("age").innerHTML = json.age; } else{ $("msg").innerHTML = "用户不存在"; $("id").innerHTML = ""; $("username").innerHTML = ""; $("age").innerHTML = ""; } } function $(id) { return document.getElementById(id); }