一、通过三个问答来认识一下Ajax

什么是Ajax?

Ajax是Asynchronous Javascript And XML的缩写,它是一种技术。

Ajax有什么用?

这一技术能够向服务器请求额外的数据而不用卸载页面。

Ajax有什么好处?

会带来更好的用户体验。

二、Ajax的前世

1)前端的Ajax

早在Ajax出世之前,Ajax式的通信要通过一些Hack才能完成,大多数是使用隐藏的框架或内嵌框架。(很遗憾我不是在那个时期成长起来的,所以就不太熟悉了,大概是利用iframe来实现的,只不过是不跨域而已)

2)中间件的Ajax

在Ajax出世之前,有一种叫远程脚本的技术,它的工作和Ajax类似。Javascript要借助Java applet或者Flash等中间件才能实现。(具体是怎么来做的,我也不是很清楚,大概的原理是Javascript与中间件通信,中间件再与服务器通信)

三、Ajax的今生

Ajax技术的核心是XMLHttpRequest对象(简称XHR)。

下面只对xhr的大概过程作了简单的介绍,如果想深入了解ajax,大家可以深入了解了一下xhr的各个属性、方法和过程。

创建跨浏览器的xhr

function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else if(typeof ActiveXObject != 'undefined'){// for IE6-
if(typeof arguments.callee.activXString != 'string'){
var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp',],
i, len;
for(i=0, len=versions.length; i<len; i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activXString = versions[i];
break;
}catch(e){}
}
}
return new ActiveXObject(arguments.callee.activXString);
}else{
throw new Error('No XHR object available.');
}
}

同步xhr

var xhr = createXHR();
xhr.open('get', 'example.php', false);
xhr.send(null);

异步xhr

var xhr = createXHR();
xhr.onreadystatechange = function(){
if(xhr.readyState ==4){
if(xhr.status>=200 && xhr.status < 300 || xhr.status == 304){
console.log(xhr.responseText);
}else{
console.log('Request was unsuccessful'+xhr.status);
}
}
};
xhr.open('get', 'example.txt', true);
xhr.send(null);

四、Ajax的未来

1) xhr2

W3C开始着手xhr的规范化,xhr2进一步发展了xhr。

1>FormData

FormData用于对表单的序列化,好处是不必明确在xhr对象上设置请求的头部。xhr能够识别出FormData数据,并设置相应的头部。

xhr.open('get', 'example.txt', true);
var form = document.getElementById('form1');
xhr.send(FormData(form));

2>timeout

timeout属性表示在请求多少毫秒之后就停止请求。

xhr.open('get', 'example.txt', true);
xhr.timeout = 1000;
xhr.timeout = function(){
console.log('Request not return in a second');
}
xhr.send(null);

3>load

load用以代替readystatechange+readyState

xhr.onload = function(){
if(xhr.status>=200 && xhr.status < 300 || xhr.status == 304){
console.log(xhr.responseText);
}else{
console.log('Request was unsuccessful'+xhr.status);
}
}
xhr.open('get', 'example.php', false);
xhr.send(null);

4>progress

onprogress事件会接收一个event对象,它的target就是xhr,此外还包含了三个额外的属性:lengthComputable表示进度信息是否可用, position表示已经接收的数据的字节数, totalSize表示根据Content-Length响应头部确定的预期字节数。有了这些信息,我们就可以向用户展示一个进度条了。

xhr.onload = function(){
if(xhr.status>=200 && xhr.status < 300 || xhr.status == 304){
console.log(xhr.responseText);
}else{
console.log('Request was unsuccessful'+xhr.status);
}
};
xhr.onprogress = function(event){
var divStatus = document.getElementById('status');
if(event.lengthComputalbe){
divStatus.innerHTML = 'Received ' + event.position + 'of' +
event.totalSize + 'bytes';
}
};
xhr.open('get', 'example.php', false);
xhr.send(null);

2)CORS

这个我在前端解决跨域问题的8种方案(最新最全)中提到过,就不在这里介绍了。

3)Comet

Comet指的是一种服务器推送技术,它是一种更加高级的Ajax技术。Comet分为轮询和HTTP流两种形式。

SSE(Server Sent Event)

var source = new EventSource('myevents.php');
source.onmessage = function(event){
var data = event.data;
......
}

4)Web Sockts

这个我也在前端解决跨域问题的8种方案(最新最全)中提到过,就不在这里介绍了。

五、总结

从Ajax的发展来看,它是越来越成熟,越来越强大,它不仅在无刷新方面提升了用户体验,也在跨域访问中有着出色的能力。

AJAX的前世今生与未来的更多相关文章

  1. Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx

    Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx 1. 安装的原理,主要是解压,复制,设置三大步1 2. 目前我们常见的三大种安装模式,二进制模式与源码安装模 ...

  2. Atlas-手淘组件化框架的前世今生和未来的路

    今天手淘技术团队宣布正式开源它们的容器框架Atlas,项目地址: https://github.com/alibaba/atlas 同时他们还推出了项目官网,上线了技术文档: http://atlas ...

  3. 吐血整理,一文读懂中国金融衍生品市场的前世今生和未来[z]

    [z]https://www.gfedu.cn/cfrm/content_22687.shtml 从定义上来说,金融衍生工具(derivativesecurity)是在货币.债券.股票等传统金融工具的 ...

  4. MVC之Ajax

    MVC之Ajax如影随行 2014-07-04 10:34 by 书洞里的猫, 15 阅读, 0 评论, 收藏, 编辑 一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢? ...

  5. ASP.NET MVC之Ajax如影随行

    一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢?<舌尖上的中国>大家都看了,那些美食估计你是百看不厌,但是里边我觉得其实也有这样的一个哲学:关于食材,对于种 ...

  6. MVC之Ajax如影随行

    一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢?<舌尖上的中国>大家都看了,那些美食估计你是百看不厌,但是里边我觉得其实也有这样的一个哲学:关于食材,对于种 ...

  7. CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

    前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display:inline;*zoom:1;.然后发 ...

  8. Thymeleaf+Spring整合

    前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是SpringMvc框架. 注意Thymeleaf支持同Spring框架的3.和4.版本的集成,但是这两个版本的支持是封装在thym ...

  9. 运行计划之误区,为什么COST非常小,SQL却跑得非常慢?

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38321477 2014.7.31就晚20:30 My Oracle Support组猫大师 ...

随机推荐

  1. 超强汇总!110 道 Python 面试笔试题

    https://mp.weixin.qq.com/s/hDQrimihoaHSbrtjLybZLA 今天给大家分享了110道面试题,其中大部分是巩固基本python知识点,希望刚刚入手python,对 ...

  2. windows安装安卓开发环境Eclipse+SDK+ADT

    准备条件 操作系统:win7 64位 需要的资源:JDK.Eclipse.SDK.ADT 步骤简介: 第一步:下载安装最新版JDK 第二步:下载安装Eclipse 第三步:下载安装SDK 第四步:安装 ...

  3. 动态Lambda表达式打印HelloWorld

    最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...

  4. Android四大组件之contentProvider(续)

    1.content provider与网页有何相似之处? contentProvider使用authority 同网站的域名类似 contentProvider还可以提供类似于网站的索引方式      ...

  5. 制作VR视频播放器

    最近VR火的不要不要的,但是综合起来,VR资源最多的还是全景图片和全景视频,今天在这里给大家简单介绍一下如何用Unity制作简单的VR视频播放器. 首先找到EasyMovieTexture这个插件,A ...

  6. HSTS的来龙去脉

    前言 安全经常说“云.管.端”,“管”指的是管道,传输过程中的安全.为了确保信息在网络传输层的安全,现在很多网站都开启了HTTPS,也就是HTTP+TLS,在传输过程中对信息进行加密.HTTPS使用了 ...

  7. windows内核提权

    Windows by default are vulnerable to several vulnerabilities that could allow an attacker to execute ...

  8. C内存对齐问题-bus error!总线错误!其实是 字符串字面量修改问题!

    最近写个小程序,出现bus error! int main(void) { /** * char :1个字节 * char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也 ...

  9. Work at DP

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...

  10. SFM学习

    摘自李翠http://www.cnblogs.com/serser/p/6598621.html SFM 1.相机模型,内参数和外参数矩阵,相机标定: 2.极线约束和本征矩阵:特征点提取与匹配:提取到 ...