第21章 Ajax与Comet

改变传统的“单击、等待”模式
Ajax技术的核心是XMLHttpRequest对象(XHR)

一、XMLHttpRequest对象
IE5中,通过MSXML库中的ActiveXObject对象来实现
IE7+、Chrome、Firefox、Opera、Safari都支持原生的XMLHttpRequest对象

XHR对象的方法:
1)open(参数1,参数2,参数3)---->启动请求预备发送
参数1:请求的方法(get或post等)
参数2:URL(相对于执行代码的当前界面)不可跨域请求
参数3:true(异步,js代码继续执行而无需等待响应)false(同步,js代码会等到服务器响应之后再执行)

2)send(参数)---->请求分派到服务器
参数:请求主体发送的数据,没有的话为null

3)abort()---->接收到响应之前调用此方法,可以取消异步请求

收到响应后,自动填充的XHR属性:
status:响应的http状态,确定响应是否成功返回
statusText:响应状态码的说明
responseText:响应主体返回的内容
responseXML:返回内容是XML格式时,是XML DOM文档,否则为null

readyState:异步时使用,有以下几种值::
0:未初始化,未调用open方法
1:已经初始化,启动了open,未使用send
2:启动了send,未收到响应
3:已经接收部分数据
4:已经接收全部数据,并可以在客户端使用
注意:这个属性的变化会引发readystatechange事件,一般在调用open之前对这个事件做好处理。

下面总结一下status的几种常见的值:
200 返回成功
304 跟浏览器说我这里的资源没有被修改!!你自己的缓存里已经有啦,不要来烦我啦

XHR对象操作请求头和响应头:
setRequestHeader(参数1,参数2)---->设置自定义的请求头信息
参数1:头部字段的名称
参数2:头部字段的值
注意:open之后、send之前调用

getResponseHeader(字段名)---->
getAllResponseHeaders()---->返回全部头部信息

get请求和post请求:
get请求:可以将字符串参数追加到URL尾部,请求速度更快

post请求:把数据作为请求的主体提交,可以包含非常多的数据,而且格式不限,耗费资源更多;
可以模拟表单数据提交,来提交post的数据,设置请求头信息:
Content-Type:application/x-www-form-urlencoded

二、XHR对象的发展:XHR2.0
新定义了FormData类型(不必设置请求头信息)
IE8开始提出的,timeout属性,超过了timeout属性值以后,触发timeout事件
Firefox最早提出的overrideMimeType(),在send之前重新设定响应内容的类型

三、进度事件
1)loadstart:接收到第一个字节触发
2)process:持续触发
利用这个属性可以定制一个进度条
触发onprocess事件的XHR对象有三个属性(进度信息是否可用、已接收字节数、预期接收字节数)
3)error:错误时触发
4)abort:调用abort()触发
5)load:接收到完整数据时触发,用于简化readystatechange事件
6)loadend:通信完成或者触发了error、abort、load时触发

四、跨域
XHR的限制:跨域安全策略
跨域:协议、域名、端口 任一不同
跨域危险:CSRF跨站点请求伪造(未经授权系统有权访问某资源) XSS跨站点脚本

官方解决方案:CORS跨域资源共享
思想:使用自定义的头信息,让浏览器和服务器进行沟通,协商是否允许请求或者响应,如果服务器返回的响应头信息和浏览器发送的请求头信息相同URL,则表示允许!
注意:请求和响应中都不包含cookie信息

IE对CORS的实现:引入了XDR(只能异步)
同样,请求和响应中都不包含cookie信息
只支持get和post方法
不能读取响应头信息
只能设置请求头中的Content-Type字段,设置发送数据的格式
只能访问响应的原始文本,不能得到响应的状态代码

其他浏览器对CORS的实现:
跨域XHR对象
支持同步
可以访问响应的状态代码
使用绝对路径,加以区分
不能发送和接收cookie
不能设置自定义头信息
调用getAllResponseHeaders()返回空字符串

Preflight Request:第一次发送请求时会多一次http请求

带凭据(cookie等信息)的请求:

其他跨域技术:CORS出现之前
1)图像ping,动态创建图像,利用img.src
特点:只能get方法、不能访问响应文本,单向通信

2)JSONP:回调函数(响应到来时在页面中调用的函数)+数据(传入回调函数的json数据)
利用动态script的src(有能力不受限制从其他域加载资源)
特点:双向通信,可以访问响应文本
但是无法确定跨域是否安全
无法确定是否请求成功,网速和带宽会影响判断,script的onerror事件暂时没有得到浏览器的支持

五、Comet
Ajax:从页面向服务器请求数据
Comet:服务器向页面推送数据(更实时)

实现Comet的两种方式:
1)长轮询
短轮询:浏览器定时向服务器发送请求
长轮询:浏览器发送一个请求以后,服务器一直打开,直到发送完数据
2)HTTP流
只存在一个HTTP连接
浏览器发送请求后,服务器一直打开,周期性发送数据

六、Web Socket
在一个单独的持久连接上,全双工、双向通信
必须使用支持Web Socket协议(快速传输小数据)的服务器才可以正常工作
可以跨域 必须传入绝对URL

你可能感兴趣的:(第21章 Ajax与Comet)