第33章 Ajax

2005年Jesse James Garrett发表了一篇文章,标题为:“Ajax:A new Approach to Web Applications”。他在这篇文章里介绍了一种技术,用他的话说,就叫:Ajax,是Asynchronous JavaScript + XML的简写。这种技术能够想服务器请求额外的数据而无须卸载页面(即刷新),会带来更好的用户体验。一时间,席卷全球。

 

一.XMLHttpRequest

Ajax技术核心是XMLHttpRequest对象(简称XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现。在XHR出现之前,Ajax式的通信必须借助一些hack手段来实现,大多数是使用隐藏的框架或内嵌框架。

XHR的出现,提供了向服务器发送请求和解析服务器响应提供了流畅的接口。能够以异步方式从服务器获取更多的信息,这就意味着,用户只要触发某一事件,在不刷新网页的情况下,更新服务器最新的数据。

虽然Ajax中的x代表的是XML,但Ajax通信和数据格式无关,也就是说这种技术不一定使用XML。

IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR对象,在这些浏览器中创建XHR对象可以直接实例化XMLHttpRequest即可。

var xhr = new XMLHttpRequest();

alert(xhr); //XMLHttpRequest

如果是IE6及以下,那么我们必须还需要使用ActiveX对象通过MSXML库来实现。在低版本IE浏览器可能会遇到三种不同版本的XHR对象,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0。我们可以编写一个函数。

function createXHR() {

if (typeof XMLHttpRequest != ‘undefined‘) {

return new XMLHttpRequest();

} else if  (typeof ActiveXObject != ‘undefined‘) {

var versions = [

‘MSXML2.XMLHttp.6.0‘,

‘MSXML2.XMLHttp.3.0‘,

‘MSXML2.XMLHttp‘

];

for (var i = 0; i < versions.length; i ++) {

try {

return new ActiveXObject(version[i]);

} catch (e) {

//跳过

}

}

} else {

throw new Error(‘您的浏览器不支持XHR对象!‘);

}

}

var xhr = new createXHR();

在使用XHR对象时,先必须调用open()方法,它接受三个参数:要发送的请求类型(get、post)、请求的URL和表示是否异步。

xhr.open(‘get‘, ‘demo.php‘, false); //对于demo.php的get请求,false同步

PS:demo.php的代码如下:

<?php echo Date(‘Y-m-d H:i:s‘)?> //一个时间

open()方法并不会真正发送请求,而只是启动一个请求以备发送。通过send()方法进行发送请求,send()方法接受一个参数,作为请求主体发送的数据。如果不需要则,必须填null。执行send()方法之后,请求就会发送到服务器上。

xhr.send(null); //发送请求

当请求发送到服务器端,收到响应后,响应的数据会自动填充XHR对象的属性。那么一共有四个属性:


属性名


说明


responseText


作为响应主体被返回的文本


responseXML


如果响应主体内容类型是"text/xml"或"application/xml",则返回包含响应数据的XML DOM文档


status


响应的HTTP状态


statusText


HTTP状态的说明

接受响应之后,第一步检查status属性,以确定响应已经成功返回。一般而已HTTP状态代码为200作为成功的标志。除了成功的状态代码,还有一些别的:


HTTP状态码


状态字符串


说明


200


OK


服务器成功返回了页面


400


Bad Request


语法错误导致服务器不识别


401


Unauthorized


请求需要用户认证


404


Not found


指定的URL在服务器上找不到


500


Internal Server Error


服务器遇到意外错误,无法完成请求


503


ServiceUnavailable


由于服务器过载或维护导致无法完成请求

我们判断HTTP状态值即可,不建议使用HTTP状态说明,因为在跨浏览器的时候,可能会不太一致。

addEvent(document, ‘click‘, function () {

var xhr = new createXHR();

xhr.open(‘get‘, ‘demo.php?rand=‘ + Math.random(), false); //设置了同步

xhr.send(null);

if (xhr.status == 200) { //如果返回成功了

alert(xhr.responseText); //调出服务器返回的数据

} else {

alert(‘数据返回失败!状态代码:‘ + xhr.status + ‘状态信息:‘ + xhr.statusText);

}

});

以上的代码每次点击页面的时候,返回的时间都是时时的,不同的,说明都是通过服务器及时加载回的数据。那么我们也可以测试一下在非Ajax情况下的情况,创建一个demo2.php文件,使用非Ajax。

<script type="text/javascript" src="base.js"></script>

<script type="text/javascript">

addEvent(document, ‘click‘, function () {

alert("<?php echo Date(‘Y-m-d H:i:s‘)?>");

});

</script>

同步调用固然简单,但使用异步调用才是我们真正常用的手段。使用异步调用的时候,需要触发readystatechange事件,然后检测readyState属性即可。这个属性有五个值:



状态


说明


0


未初始化


尚未调用open()方法


1


启动


已经调用open()方法,但尚未调用send()方法


2


发送


已经调用send()方法,但尚未接受响应


3


接受


已经接受到部分响应数据


4


完成


已经接受到全部响应数据,而且可以使用

addEvent(document, ‘click‘, function () {

var xhr = new createXHR();

xhr.onreadystatechange = function () {

if (xhr.readyState == 4) {

if (xhr.status == 200) {

alert(xhr.responseText);

} else {

alert(‘数据返回失败!状态代码:‘ + xhr.status + ‘状态信息:‘

+ xhr.statusText);

}

}

};

xhr.open(‘get‘, ‘demo.php?rand=‘ + Math.random(), true);

xhr.send(null);

});

PS:使用abort()方法可以取消异步请求,放在send()方法之前会报错。放在responseText之前会得到一个空值。

二.GET与POST

在提供服务器请求的过程中,有两种方式,分别是:GET和POST。在Ajax使用的过程中,GET的使用频率要比POST高。

在了解这两种请求方式前,我们先了解一下HTTP头部信息,包含服务器返回的响应头信息和客户端发送出去的请求头信息。我们可以获取响应头信息或者设置请求头信息。我们可以在Firefox浏览器的firebug查看这些信息。

//使用getResponseHeader()获取单个响应头信息

alert(xhr.getResponseHeader(‘Content-Type‘));

//使用getAllResponseHeaders()获取整个响应头信息

alert(xhr.getAllResponseHeaders());

//使用setRequestHeader()设置单个请求头信息

xhr.setRequestHeader(‘MyHeader‘, ‘Lee‘); //放在open方法之后,send方法之前

PS:我们只可以获取服务器返回回来响应头信息,无法获取向服务器提交的请求头信息,自然自定义的请求头,在JavaScript端是无法获取到的。

GET请求

GET请求是最常见的请求类型,最常用于向服务器查询某些信息。必要时,可以将查询字符串参数追加到URL的末尾,以便提交给服务器。

xhr.open(‘get‘, ‘demo.php?rand=‘ + Math.random() + ‘&name=Koo‘, true);

通过URL后的问号给服务器传递键值对数据,服务器接收到返回响应数据。特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理,中文字符的返回及传参,可以讲页面保存和设置为utf-8格式即可。

//一个通用的URL提交函数

function addURLParam(url, name, value) {

url += (url.indexOf(‘?‘) == -1 ? ‘?‘ : ‘&‘); //判断的url是否有已有参数

url += encodeURIComponent(name) + ‘=‘ + encodeURIComponent(value);

alert(url);

return url;

}

PS:当没有encodeURIComponent()方法时,在一些特殊字符比如“&”,会出现错误导致无法获取。

POST请求

POST请求可以包含非常多的数据,我们在使用表单提交的时候,很多就是使用的POST传输方式。

xhr.open(‘post‘, ‘demo.php‘, true);

而发送POST请求的数据,不会跟在URL的尾巴上,而是通过send()方法向服务器提交数据。

xhr.send(‘name=Lee&age=100‘);

一般来说,向服务器发送POST请求由于解析机制的原因,需要进行特别的处理。因为POST请求和Web表单提交是不同的,需要使用XHR来模仿表单提交。

xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);

PS:从性能上来讲POST请求比GET请求消耗更多一些,用相同数据比较,GET最多比POST快两倍。

上一节课的JSON也可以使用Ajax来回调访问。

var url = ‘demo.json?rand=‘ + Math.random();

var box = JSON.parse(xhr.responseText);

 

三.封装Ajax

因为Ajax使用起来比较麻烦,主要就是参数问题,比如到底使用GET还是POST;到底是使用同步还是异步等等,我们需要封装一个Ajax函数,来方便我们调用。

function ajax(obj) {

var xhr = new createXHR();

obj.url = obj.url + ‘?rand=‘ + Math.random();

obj.data = params(obj.data);

if (obj.method === ‘get‘) obj.url = obj.url.indexOf(‘?‘) == -1 ?

obj.url + ‘?‘ + obj.data : obj.url + ‘&‘ + obj.data;

if (obj.async === true) {

xhr.onreadystatechange = function () {

if (xhr.readyState == 4) callback();

};

}

xhr.open(obj.method, obj.url, obj.async);

if (obj.method === ‘post‘) {

xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);

xhr.send(obj.data);

} else {

xhr.send(null);

}

if (obj.async === false) {

callback();

}

function callback () {

if (xhr.status == 200) {

obj.success(xhr.responseText); //回调

} else {

alert(‘数据返回失败!状态代码:‘ + xhr.status + ‘,

状态信息:‘ + xhr.statusText);

}

}

}

//调用ajax

addEvent(document, ‘click‘, function () { //IE6需要重写addEvent

ajax({

method : ‘get‘,

url : ‘demo.php‘,

data : {

‘name‘ : ‘Lee‘,

‘age‘ : 100

},

success : function (text) {

alert(text);

},

async : true

});

});

//名值对编码

function params(data) {

var arr = [];

for (var i in data) {

arr.push(encodeURIComponent(i) + ‘=‘ + encodeURIComponent(data[i]));

}

return arr.join(‘&‘);

}

PS:封装Ajax并不是一开始就形成以上的形态,需要经过多次变化而成。

时间: 2024-10-13 02:36:08

第33章 Ajax的相关文章

第33章 项目实战-兼容式响应布局1

第33 章项目实战-兼容响应式布局[1]学习要点:1.响应式初探2.起始部分 本章主要开始如果将前两个项目再进行重构,设计成既可以在PC 端正常显示,又可以在PAD 上浏览,还可以在移动端有良好的体验.这些都必须兼容,那只有使用响应式设计了.一.响应式初探在前面的两个项目中,我们分别设计了PC 端固定布局和移动端流体布局的案例.其实,通过上面两个案例,已经可以做出兼容PC.PAD 和移动端的响应式页面了.而本节课,就是将上面两个案例改成三个终端都可以正常显示的响应式布局.我们这节课并不去过多的探

第33章 项目实战-兼容式响应布局3

第33 章项目实战-兼容响应式布局[3]学习要点:1.标题响应式2.图片响应式 本章主要开始如果将前两个项目再进行重构,设计成既可以在PC 端正常显示,又可以在PAD 上浏览,还可以在移动端有良好的体验.这些都必须兼容,那只有使用响应式设计了.一.标题响应式在首页的热门旅游这个主要区域,有一个大标题和小标题.通过响应式来设置他们在不同分辨率显示的字体大小.//PC 端移植<div id="tour"><section class="center"&

(转)JAVA AJAX教程第四章—AJAX和MVC的简单结合

这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这里用AJAX来实现这个效果.这个实例里结合了MySql.Servlet还有Js,理论性很少,但通过实践来感受理论知识. 一个页面中应用了 AJAX,同时他也能实现MVC框架,可以吗?当然可以的.通过页面调用AJAX,这个页面就是MVC中的V,他用来前台显示与用户交互的内容.用 JavaBean作为M

(转)JAVA AJAX教程第三章—AJAX详细讲解

现在开始深入AJAX,这里还是按老思路,理论和实践相结合.这章的内容主要是讲解AJAX步骤详解,下一张将会用一个AJAX技术实现页面提示效果的实例来说明AJAX的实现. 一.AJAX步骤详解 AJAX实质上是遵循Request/Server模式来进行工作的,这个框架基本的流程包括下面几个具体的步骤: (1)       XMLHttpRequest对象初始化 (2)       发送请求 (3)       服务器接收请求并进行处理 (4)       服务器返回响应数据 (5)       客

第33章 项目实战-兼容式响应布局2

第33 章项目实战-兼容响应式布局[2]学习要点:1.搜索响应式2.底部响应式 本章主要开始如果将前两个项目再进行重构,设计成既可以在PC 端正常显示,又可以在PAD 上浏览,还可以在移动端有良好的体验.这些都必须兼容,那只有使用响应式设计了.一.搜索响应式在PC 端,我们将搜索的文本框和按钮至于大背景前,移动端我们直接放在了大图片的下方.那么在响应式这里,我们还是遵循PC 端,只不过采用流体缩放外加响应式控制来兼容显示.//PC 端移植,并稍作修改<div id="adver"

第33章个人性格(代码大全5)

第33章 Personal Character 个人性格 33.1 个人性格是否和本书话题无关 33.2 聪明和谦虚 33.3 求知欲 33.4 诚实 33.5 交流与合作 33.6 创造力和纪律 33.7 懒惰 33.8 不如你想象中那样其作用的性格因素 33.9 习惯 33.1 Isn't Personal Character Off The Topic 个人性格是否和本书话题无关 编程过程非常耗用脑力,这种特性使得个人性格显得很重要.编程工作本质上是项无法监督的工作,因为没人真正清楚你正在

第21章 Ajax 与 Comet

第21章 Ajax 与 Comet 21.1 XMLHttpRequest 对象 21.1.1 XHR的用法 21.1.2 HTTP 头部信息 21.1.3 GET请求 21.1.4 POST请求 21.2 XMLHttpRequest 2级 21.2.1 FormData 21.2.2 超市设定 21.2.3 overrideimeType()方法 21.3 进度事件 21.3.1 load事件 21.3.2 progress事件 21.4 跨域资源共享 21.4.1 IE对CORS的实现 2

accp8.0转换教材第10章Ajax和jQuery理解与练习

C/S (Client/Server)结构,即大家熟知的客户机和服务器结构. B/S(Browser/Server)结构即浏览器和服务器结构. 认识ajax .XMLHttpRequest.使用jquery实现ajax.处理json格式的响应数据.使用原生态JavaScript实现ajax 一.杂记 1.传统web技术和ajax的请求方式不同 ajax是只获得需要的元素  传统刷新全部 2.ajax的全称是"Asynchronous Javascript And XML"(异步Java

第六章 ajax

ajax应用程序通常只不过是一个针对HTML的代码块请求.这种被称作AHAH(asynchronous HTTP and HTML,异步HTTP和HTML)的技术,通过jQuery来实现. 所有的Ajax请求在默认情况下都是异步的. 对于必须要延迟到加载完成才能继续的操作,jQuery提供了一个回调函数没通过回调函数可以再某些效果完成之后执行操作.Ajax回调的功能与此类似,只不过是在数据从服务器返回后执行操作. 1.追加HTML 2.操作javascript 取得JSON 前面我们曾经看到过,