javascript:Ajax与Comet
一:使用XMLHttpRequest对象
ajax的核心是XMLHttpRequest对象。IE7以下的浏览器XHR定义方法不同。对于较高级的浏览器 var xhr = new XMLHttpRequest().
var xhr = new XMLHttpRequest(); xhr.open() xhr.send(null)
xhr.open接收三个参数,第一个为发送方式get或者post。第二个参数是URL,第三个参数是布尔值,是否是异步。
xhr.send(null),参数为向服务器发送的数据,如果没有,必须写上null.
浏览器的响应数据作为xhr的属性:responseText,responseXML,status,statusText。status的状态为200表示成功,状态为304表示内容没有被修改,可以直接使用缓存。
2)异步请求下,xhr的属性readyState,表示当前活动状态,等于4时表示成功,每当状态改变时都会调用onreadystatechange()事件,该事件的定义必须放在xhr.open函数之前。
xhr.abort()取消异步请求
3)设置和获取http请求的头部信息
默认情况下,会发送下列头部信息:
Accpet--浏览器可以处理的内容类型
Accept-Charset -- 可以接收的字符集
Accept-Encoding---压缩编码
Connection --- 浏览器与服务器的连接类型
Cookie
Host -- 发送请求页面所在的域
Referer--发送请求页面URI
User-Agent -- 浏览器的用户代理字符串
通过方法xhr.setRequestHeader(头部字段名称名称,要设置的值)进行头部信息的自定义设置。
获取响应的头部信息:xhr.getResponseHeader(头部字段名称) , getAllResponseHeaders()获取所有的头部信息
4)get请求--url字符串编码问题
url中的每个字符串必须要使用encodeURIComponent()进行编码,例如example.php?name1=value1&name2=value2,encodeURLComponent(name1),encodeURLComponent(value1)
5) post请求
向服务器发送数据,xhr.send(data)。FormData对象,定义发送的表单对象,var data = new FormData(),data.append(key,value),参数为表单字段名称和字段中对应的值,或者new FormData(document.forms[0]) ,使用FormData 不必明确地设置请求头部。FormData对象是在xhr2级中出现的。
6)timeout 超时设定
xhr.timeout = 1000hs。当超时时会触发ontimeout事件,xhr.ontimeout = function(){}
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if (xhr.readystate == 4) { try{ if((xhr.statue>=200 && xhr.status<=300)||xhr.status==304) {xhr.responseText} } catch(ex){//假设有ontimeout处理事件} } } xhr.open(); xhr.timeout = 1000; xhr.ontimeout = function(){} xhr.send(null)
二:使用XMLHttpRequest事件
进度事件:有以下6个进度事件。loadstart、progress、error、abort、load、loadend。
1)load事件在接受到完整的响应事件触发
使用load事件优化:
var xhr = new XMLHttpRequest(); xhr.onload = function(){ try{ if((xhr.statue>=200 && xhr.status<=300)||xhr.status==304) {xhr.responseText} } catch(ex){//假设有ontimeout处理事件} } xhr.open(); xhr.timeout = 1000; xhr.ontimeout = function(){} xhr.send(null)
浏览器只要接收到服务器响应,不管状态如何都会触发load事件,因此必须要检查status.
2)使用progress事件创建进度条
onprogress事件接收到一个event对象,event对象有个属性target,指向XHR对象,另外还包括lengthComputabel(布尔值,表示是否可用), totalsize , position。
三:跨域Ajax通信的限制
CORS(跨域资源共享),其基本思想是自定义http头部信息,让浏览器与服务器进行沟通,从而决定请求是成功还是要失败。
1:IE对CORS的实现
IE8中引入了XDR来实现跨域请求,XDR与XHR的不同之处:只能进行GET、POST请求;不能访问响应头部信息;只能设置Content-type头部信息;cookie不能随请求发送。
XDR请求时包含一个origin的头部,其中包含请求页面的源信息(协议、域名和端口)
2:其他浏览器对CORS的支持
其他浏览器都支持原生的CORS实现跨域请求,跨域请求url使用绝对路径,同源请求使用相对路径,但跨域XHR的不同有:不能请求和发送cookie;不能使用setrequestheader设置自定义头部信息;调用getallresponseheaders总是返回空字符串。
3:Prefighted Requests
CORS通过一种叫做 prefighted request 的透明服务器验证机制支持开发人员使用自定义的头部、使用除get post之外的其他请求。
4:带凭据的请求
跨域请求不提供凭据,无法发送cookie,通过将withcredentials设置为true,可以指定某个请求应该发送凭据。
5:跨浏览器的CORS的解决方案
判断浏览器是否支持CORS,只要判断实行withCredentials是否存在即可。
function createCORSRequest(method,url){ var xhr = new XMLHTTRequest(); if ("withCredentials" in xhr){ xhr.open(method,url,ture); } else if(typeof XDomainRequest != "undefined"){ xhr = new XDomainRequest(); xhr.open(method,url); }else {xhr = null;} return xhr; } var request = createCORSRequest("get","htttp...."); if(request){ request.onload = function(){ //处理responseText }; request.send(); }
6:其他跨域技术
主要将JSONP技术
JSONP与JSON看起来差不多,只不过是被包含在回调函数中的JSON,如callback({"key":"value"})
JSONP由两部分组成:回调函数和数据。回调函数是当接收到响应数据时调用的函数,函数的名字在请求中指定。数据就是传入回调函数中的JSON数据。
JSONP是通过动态script来实现中,可以在src属性中指定一个跨域URL。
function handleResponse(){ } var script = document.createElement("script"); script.src = "http://www.hhh.com/json?callback=handleResponse"; document.body.appendChild(script);