Ajax介绍
来源:互联网 发布:matlab 结构体数组 编辑:程序博客网 时间:2024/06/09 14:15
Ajax是异步的JavaScript和XML,它是JavaScript、XML、CSS、DOM等多种已有技术的组合,可实现客户端的异步请求操作,进而在不需要刷新整个页面的情况下与服务器进行通信,
减少了用户的等待时间,减轻了服务器和带宽的负担,提高了性能。
传统的web项目,页面中用户的每一次操作都将触发一次HTTP请求,服务器进行请求处理后,返回一个HTML页面给客户端;
在Ajax应用中,页面中用户的操作将通过Ajax引擎与服务器端进行通信,然后将返回结果提交给客户端页面的Ajax引擎,再由Ajax引擎来决定将这些数据插入到指定位置;
Ajax在用户与服务器之间引入了一个Ajax引擎,从而消除了网络交互过程中的处理-等待-处理-等待的缺点,Ajax的好处主要体现在以下几个方面:
1:减轻服务器的负担,Ajax的原则是按需求获取数据,这可以最大程度的减少冗余请求和响应对服务器造成的负担。
2:可以把一部分以前由服务器负担的工作转移到客户端,利用客户端闲置的资源进行处理,减轻服务器和带宽的负担,节约空间。
3:无刷新更新页面,从而使用户不用再像以前一样在服务器处理数据时,只能在白屏前等待,Ajax使用XMLHttpRequest对象发送请求并得到服务器的响应,在不需要重新载入整个页面的情况下,就
可以通过DOM及时将更新的内容显示在页面上。
4:可以调用XML等外部数据,进一步促进页面显示和数据的分离。
5:基于标准化的并被广泛支持的技术,不需要下载插件。
Ajax是XMLHttpRequest对象和JavaScript、XML、CSS、DOM等多种技术的组合:
XMLHttpRequest对象
XMLHttpRequest对象是Ajax中的核心技术,它是具有应用程序接口的javaScript对象,能够使用HTTP连接一个服务器,通过XMLHttpRequest对象,Ajax可以像桌面应用程序一样只同服务器进行数据层面的
交换,而不用每次都刷新页面,也不用每次都将数据处理的工作交给服务器来完成,这样也减轻了服务器负担,加快了响应速度,缩短了用户等待时间
要使用XMLHttpRequest对象,首先需要初始化,对于IE和非IE浏览器,初始化的方式也不同
IE将XMLHttpRequest对象实例化为一个ActiveX对象,具体方法如下:
var http_request = new ActiveXObject("Msxml2.XMLHTTP");或者:
var http_requset1 = new ActiveXObject("Microsoft.XMLHTTP");
Msxml2.XMLHTTP和Microsoft.XMLHTTP是针对IE版本的不同而进行设置的,IE7以下使用Microsoft.XMLHTTP;
非IE浏览器将XMLHtttpRequest实例化为一个本地JavaScript对象,具体方法如下:
var http_requset2 = new XMLHttpRequest();为了提高程序的兼容性,可以创建跨浏览器的XMLHttpRequest对象,方法很简单,只需要判断一下不同浏览器的实现方式,具体代码如下:
if(window.XMLHttpRequest){ //非IE浏览器 http_requset3 = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{ http_requset3 = new ActiveXObject("Msxml2.XMLHTTP"); }catch (e){ try { http_requset3 = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){} } }调用window.ActiveXObject将返回一个对象或null,在if语句中会把返回值看作是true或false(如果返回对象则为true,否则为false);
XMLHttpRequest对象的常用方法:
1:open()方法
open()方法用于设置进行异步请求目标的url,请求方法以及其他参数信息,语法格式如下:
open("method","url","true","user","password");method:用于指定请求的类型,一般为get,post;
URL:用于指定请求地址,可以使用绝对地址或者相对地址,并且可以传递查询字符串;
async:可选参数,用于指定请求方式,异步请求为true,同步请求为false,默认为true;
user:可选参数,用于指定请求用户名,没有时可省略;
password:可选参数,用于指定请求密码,没有时可以省略
2:send()方法
send()方法用于向服务器发送请求,如果请求声明为异步,该方法将立即返回,否则将等到接收到响应为止,语法格式如下:
http_requset3.send(content);参数content用于指定发送的数据,可以是DOM对象的实例,输入流或字符串,如果没有参数需要传递可以设置为null;
3:setRequestHeader()方法
setRequestHeader()方法用于为请求的HTTP头设置值,语法格式如下:
http_requset3.setRequestHeader("Content-Type","application/x-www-form-urlencoded");注意,setRequestHeader()方法必须在调用open()方法之后才能调用,在发送post请求时一般需要设置content-Type请求头;
4:abort()方法
abort()方法用于停止当前异步请求;
5:getResponseHeader()方法
getResponseHeader()方法用于以字符串形式返回指定的Http头信息,语法格式如下:
http_requset3.getResponseHeader("Content-Type");参数包括Server,Content-Type和Date等
6:getAllResponseHeaders()方法
getAllResponseHeaders()方法用于以字符串形式返回完整的HTTP头信息;
XMLHttpRequest对象的常用属性:
发送请求实例:
1:创建一个跨浏览器的XMLHttpRequest对象,并且判断XMLHttpRequest是否创建成功
if(window.XMLHttpRequest){ //非IE浏览器 http_requset3 = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{ http_requset3.getResponseHeader("Content-Type"); }catch (e){ try { http_requset3 = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){} } } if(!http_requset3){ alert("XMLHttpRequest对象创建失败") return false; }2:为XMLHttpRequest对象指定一个回调函数,用于对返回结果进行处理
http_requset3.onreadystatechange = getResult;//调用回调函数注意,使用XMLHttpRequest对象的onreadystatechange属性指定回调函数时,不能指定要传递的参数,如果要传递参数,可以应用一下方法:
http_requset3.onreadystatechange = function(){getResult(param)}//带参数的回调函数3:创建一个与服务器的连接,在创建时,需要指定发送请求的方式(即get或post),以及设置是否采用异步方式发送请求:
采用get方式发送请求:
http_requset3.open("get","index.jsp",true);采用post方式发送请求:
http_requset3.open("post","index.jsp",true);open()方法中的url参数可以是一个jsp,也可以是一个servlet地址;
在指定url参数时,最好将一个时间戳追加到该url参数的后面,这样可以防止因浏览器缓存结果而不能实时得到最新的结果;
4:向服务器发送请求,利用XMLHttpRequest对象的send()方法可以实现向服务器发送请求,该方法需要传递一个参数,如果发送的是get请求,可以将该参数设置为null,
如果发送的是post请求,可以通过该参数指定要发送的请求参数:
http_requset3.send("user="+name);
需要注意的是,在发送post请求前,还需要设置正确的请求头:
http_requset3.setRequestHeader("Content-Type","application/x-www-form-urlencoded");设置请求头必须在send()方法之前调用;
处理服务器响应
在上面,我们设置了一个回调函数,用于处理服务器响应,在这个回调函数中,首先需要判断服务器的请求状态,保证请求已完成,然后再根据服务器的HTTP状态码来判断服务器是否响应成功,如果
响应成功,则获取服务器的响应反馈给服务端。
将字符串响应显示到提示对话框中的回调函数代码如下:
function getResult(){ if(http_requset3.readyState == 4){ if(http_requset3.status == 200){ alert(http_requset3.responseText); }else{ alert("你请求的页面出错"); } } }处理xml响应
//处理XML响应 function getResult() { if (http_requset3.readyState == 4) { if (http_requset3.status == 200) { var xmldoc = http_requset3.responseXML; var msgs = ""; for (var i = 0; i < xmldoc.getElementsByTagName("board").length; i++) { var board = xmldoc.getElementsByTagName("board")[i]; msgs = msgs + board.getAttribute("name") + "的留言: " + board.getElementsByTagName("msg")[0].firstChild.data + "<br>"; } } } }要遍历的xml格式:
<?xml version="1.0" encoding="UTF-8"?><boards> <board name="exception"> <msg>你好</msg> </board> <board name="exception"> <msg>你也好</msg> </board></boards>重构Ajax
重构Ajax大致分为3个步骤
1:创建一个单独得js文件,具体代码如下:
var net = new Object();//定义一个全局变量netnet.AjaxRequest = function(url,onload, onerror, method, params){//编写构造函数 this.req = null; this.onload = onload; this.onerror = (onerror)?onerror:this.defaultError; this.loadDate(url, method, params);} //编写用于初始化的XMLHttpRequest对象并指定处理函数,最后发送HTTP请求的方法net.AjaxRequest.prototype.loadDate = function(url, method, params){ //判断method是否为空,如果为空则默认为GET if(!method){ method = "GET"; } //非IE浏览器 if(window.XMLHttpRequest){ this.req = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{ this.req = new ActiveXObject("Msxml2.XMLHTTP"); }catch (e){ try{ this.req = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){} } } //如果初始化成功 if(this.req){ try{ var loader = this; this.req.onreadystatechange = function(){//设置回调函数 net.AjaxRequest.onReadyState.call(loader); } this.req.open(method,url,true); if(method == "POST"){//如果是POST请求,设置请求头 this.req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); } this.req.send(params);//发送请求 }catch (e){ this.onerror.call(this); } } net.AjaxRequest.onReadyState = function(){//重构回调函数 if(this.req.readyState == 4){//请求完成 if(this.req.status == 200){//请求成功 this.onload.call(this); }else { this.onerror.call(this); } } } //重构默认得错误处理函数 net.AjaxRequest.prototype.defaultError = function(){ alert("错误函数\n\n回调状态:" + this.req.readyState + "\n状态:" + this.req.status); }}2:在需要应用Ajax的页面中引入第一步创建的js文件
<script language="JavaScript" src="${pageContext.request.contextPath}/javaScript/AjaxRequest.js"></script>3:在应用Ajax的页面中编写错误处理的方法,实例化Ajax对象的方法和回调函数
<script language="JavaScript" src="${pageContext.request.contextPath}/javaScript/AjaxRequest.js"> //错误处理方法 function onerror() { alert("操作错误"); } //实例化Ajax对象的方法 function getInfo() { var loader = new net.AjaxRequest("session.jsp?nocache=" + new Date().getTime(), deal_getInfo(), onerror(), "GET"); } //回调函数 function deal_getInfo() { document.getElementById("showInfo").innerHTML = this.req.responseText; } </script>
Ajax开发需要注意的几个问题:
1:浏览器兼容性的问题;
2:性能问题:
优化for循环。
尽量使用局部变量,而不使用全部变量。
尽量少用eval,每次使用eval都需要消耗大量的时间;
将DOM节点附加到文档上。
尽量减少点操作符的使用。
3:中文编码问题
Ajax不支持多字符集,其默认的字符集是UTF-8,所以在应用Ajax技术的程序中应及时进行编码转换,否则程序中将出现乱码,一般在一下两种情况下将产生中文乱码:
1:发送路径的参数中包含中文,在服务器端接收参数值时产生乱码:
将数据提交到服务器有两种方法:一种是使用GET方法,使用不同的方法提交数据时,在服务器端接收参数时解决中文乱码的方式不同,当接收GET方法提交的参数时,要将
编码转换为GBK或GB2312
由于应用POST方法提交数据时,默认的字符集编码是UTF-8,所以当接收使用POST方法提交时,要将编码转换为UTF-8。
2:返回到reponseText或responseXML的值中包含中文时产生乱码
由于Ajax在接收responseText或responseXML的值时是按照UTF-8的编码格式进行解码的,所以如果服务器端传递的数据不是UTF-8格式,在接收时就可能产生乱码,所以要保证
从服务器传递的数据采用的是UTF-8的编码
- AJAX介绍
- AJAX介绍
- Ajax介绍
- AJAX 介绍
- ajax 介绍
- AJAX介绍
- AJAX介绍
- AJAX介绍
- ajax介绍
- ajax介绍
- AJAX介绍
- Ajax介绍
- Ajax介绍
- AJAX介绍
- Ajax介绍
- 介绍AJAX
- Ajax介绍
- Ajax介绍
- 2015寒假集训周赛第一场 F 题
- iOS开发-AFNetworking之上传图片音乐文件
- arm-linux-gcc:没有那个文件或目录
- 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第二节 - ADB截屏服务
- 一篇ACM奋斗史
- Ajax介绍
- POJ2503(有delete函数)
- 一个失败者的自我反省
- Mysql启动失败问题解决
- JavaScript快速入门(三)——JavaScript语句
- mysql用户创建及权限分配
- GC学习笔记
- Objective - C基础: 第四天 - 7.类的加载过程
- sqlserver命令行操作