# AJAX


# XMLHttpRequest

  • XMLHttpRequest(XHR)对象用于与服务器交互
  • 通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。
  • 这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。 网址

# 一、创建

var xhr = new XMLHttpRequest();

# 一、发送请求

open()

xhr.open("get","example.php", false);

# 三、接收响应

responseText: 作为响应主体被返回的文本(文本形式)
responseXML: 如果响应的内容类型是'text/xml''application/xml',这个属性中将保存着响应数据的XML DOM文档(document形式)
status: HTTP状态码(数字形式)
statusText: HTTP状态说明(文本形式)

# 三、接收响应

如果接受的是同步响应,则需要将open()方法的第三个参数设置为false,那么send()方法将阻塞直到请求完成。一旦send()返回,仅需要检查XHR对象的status和responseText属性即可。 同步请求是吸引人的,但应该避免使用它们。客户端javascript是单线程的,当send()方法阻塞时,它通常会导致整个浏览器UI冻结。如果连接的服务器响应慢,那么用户的浏览器将冻结。

# 五、异步

如果需要接收的是异步响应,这就需要检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。

0(UNSENT):未初始化。尚未调用open()方法
1(OPENED):启动。已经调用open()方法,但尚未调用send()方法
2(HEADERS_RECEIVED):发送。己经调用send()方法,且接收到头信息
3(LOADING):接收。已经接收到部分响应主体信息
4(DONE):完成。已经接收到全部响应数据,而且已经可以在客户端使用了

理论上,只要readyState属性值由一个值变成另一个值,都会触发一次readystatechange事件。可以利用这个事件来检测每次状态变化后readyState的值。\

var xhr;
if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
}else{
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//异步接受响应
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            //实际操作
            result.innerHTML += xhr.responseText;
        }
    }
}
//发送请求
xhr.open('get','message.xml',true);
xhr.send();

# 原生ajax封装xhr

//封装原生xhr对象
var ck = {
  ajax: function ( url, config ){
    var method = config.method || 'GET';
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
      if( xhr.readyState == 4  ){

        if( xhr.status == 200){
          //成功
          config.success && config.success( JSON.parse( xhr.responseText )  );
        }else{
          //失败
          config.error && config.error( xhr );
        }

        //完成
        config.complete && config.complete( xhr );

      }
  }
    //GET提交参数合并
    if( method == 'GET' ){
      urlStr = '?';
      for( var key in config.data ){
        urlStr += key+'='+config.data[key]+'&'
      }
      url += urlStr.slice(0,-1)
    }
    xhr.open( method, url );
    //POST提交参数合并
    var form = null;
    if( method == 'POST' ){
      form = new FormData();
      for( var key in config.data ){
        form.append( key, config.data[key] );
      }
    }
    xhr.send( form );
  },
  get: function(){
    var args = arguments;
    var config = { method: 'GET' };
    if( 'object' === typeof args[1] ){
      config.data = args[1];
    }
    if( 'function' === typeof args[1] ){
      config.success = args[1];
    }else if( 'function' === typeof args[2] ){
      config.success = args[2];
    }
    this.ajax( args[0], config );
  },
  post: function(){
    var args = arguments;
    var config = { method: 'POST' };
    if( 'object' === typeof args[1] ){
      config.data = args[1];
    }
    if( 'function' === typeof args[1] ){
      config.success = args[1];
    }else if( 'function' === typeof args[2] ){
      config.success = args[2];
    }
    this.ajax( args[0], config );
  }

};