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);

 

  

    

posted @ 2018-03-12 18:48  LittleGirl_MyBaby  阅读(175)  评论(0编辑  收藏  举报