大家往往只从技术的角度来解释Ajax,而事实上Ajax并不是一个单一的技术概念。在技术范畴之外,Ajax还包含了很多web用户体验方面的元素,这也是为什么舆论普遍认为Ajax是一种web2.0技术的原因。毕竟web2.0的创新价值有很大一部分来自于对用户体验和用户作用的重视。Ajax所倡导的方式则能够大大优化用户的使用感受。由于在服务器和浏览器之间的数据传递交由JavaScript控制,开发人员得以跳出以往严格的请求应答模式从而构建更具有用户友好性的web应用。
Ajax首先就不是一项纯粹的技术,而更近似于一个技术框架。同时Ajax体系当中也并没有什么新的技术元素,其核心是Javascript技术,一种以往被认为与企业应用绝缘而只适用于在客户端展示一些"小把戏"的编程语言,而XML,XHTML,DOM,XML-HTTPREQUEST,CSS等经常被用于实现Ajax的技术元素也是多年应用的成熟技术。
用户与浏览器的操作交互,浏览器与服务器的数据交互是可以"异步"进行的,这也是Ajax这个名字的由来,Ajax的英文全称是Asynchronous Javascript and XML ,是指一种创建交互式网页应用的网页开发技术。 具体来说,Ajax基于以下的技术:
XHTML:对应W3C的XHTML规范,目前是XHTML1.0。
CSS:对应W3C的CSS规范,目前是CSS2.0
DOM:这里的DOM主要是指HTML DOM,XML DOM包括在下面的XML中
JavaScript:对应于ECMA的ECMAScript规范
XML:对应W3C的XML DOM、XSLT、XPath等等规范
XMLHttpRequest:对应WhatWG的Web Applications1.0规范
当用户请求新的数据内容时,传统的web机制只能等待服务器将全部数据返回,然后刷新并重新显示整个页面;而Ajax只请求那些需要改变的内容,同时只改变那些需要改变的区域,而并不对这个页面进行刷新,这种能力不但使刷新成了Ajax带给用户的最主要印象,而且由于数据传递量的有效降低使得Ajax成为缓解web性能瓶颈的重要武器。
无论是Ajax的模式还是所依托的具体技术在很多年前就已经出现了,之所以到今天才获得应用和认同,说明再先进的东西也只有在被需要的情况下才能得到真正的发展。Ajax技术之中,最核心的技术就是XMLHttpRequest,它最初的名称叫做XMLHTTP,是微软公司为了满足开发者的需要,1999年在IE5.0浏览器中率先推出的。后来这个技术被上述的规范命名为XMLHttpRequest。XMLHttpRequest为运行于浏览器中的JavaScript脚本提供了一种在页面之内与服务器通信的手段。页面内的JavaScript可以在不刷新页面的情况下从服务器获取数据,或者向服务器提交数据。
Ajax应用与传统的Web应用的区别主要在3个地方:
1. 不刷新整个页面,在页面内与服务器通信。
2. 使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的的响应能力。
3. 应用仅由少量页面组成。大部分交互在页面之内完成,不需要切换整个页面。
IBM在2月底已经发布了Open Ajax项目的Ajax Toolkit Framework(ATF)1.0,是一个基于Eclipse IDE的Ajax开发工具。异步交互、JavaScript脚本和XML封装数据是AJAX的三大特征。
首先,您拥有一些简单的定位点标记,它连接到一个JavaScriptcastVote(rank)函数。
function castVote(rank) {
var url = "/ajax-demo/static-article-ranking.html";
var callback = processAjaxResponse;
executeXhr(callback, url);
}
该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr,提供一个回调JavaScript函数,一旦服务器响应可用,
该函数就被执行。由于我希望它运行在一个简单的Apache环境中,“cast vote URL”只是一个简单的HTML页面。在实际情况中,被调用的
URL将记录票数并动态地呈现包含投票总数的响应。
下一步是发出一个XmlHttpRequest请求:
function executeXhr(callback, url) {
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = callback;
req.open("GET", url, true);
req.send(null);
} // branch for IE/Windows ActiveX version
else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = callback;
req.open("GET", url, true);
req.send();
}
}
}
如您所见,执行一个XmlHttpRequest并不简单,但非常直观。和平常一样,在JavaScript领域,大部分的工作量都花在确保浏览器兼容方
面。在这种情况下,首先要确定XmlHttpRequest是否可用。如果不能用,很可能要使用Internet Explorer,这样就要使用所提供的ActiveX实
现。
executeXhr()方法中最关键的部分是这两行:
req.onreadystatechange = callback;
req.open("GET", url, true);
第一行定义了JavaScript回调函数,您希望一旦响应就绪它就自动执行,而req.open()方法中所指定的“true”标志说明您想要异步执行该请求。
一旦服务器处理完XmlHttpRequest并返回给浏览器,使用req.onreadystatechange指派所设置的回调方法将被自动调用。
function processAjaxResponse() {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
502 502'votes').innerHTML = req.responseText;
} else {
alert("There was a problem retrieving the XML data:
" +
req.statusText);
}
}
}
现在processVoteResponse()函数开始显示出其意义了。它首先检查XmlHttpRequest的整体状态以保证它已经完成(readyStatus == 4),
然后根据服务器的设定询问请求状态。如果一切正常(status == 200),就使用innerHTML属性重写DOM的“votes”节点的内容。
凡是有该标志的文章,都是该blog博主Caoer(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。