ittiam
7/18/2017 - 6:10 AM

ajax.js

var ajax = {};
ajax.x = function() {
  if (typeof XMLHttpRequest !== 'undefined') {
    return new XMLHttpRequest();
  }
  var versions = [
    'MSXML2.XmlHttp.6.0',
    'MSXML2.XmlHttp.5.0',
    'MSXML2.XmlHttp.4.0',
    'MSXML2.XmlHttp.3.0',
    'MSXML2.XmlHttp.2.0',
    'Microsoft.XmlHttp'
  ];

  var xhr;
  for (var i = 0; i < versions.length; i++) {
    try {
      xhr = new ActiveXObject(versions[i]);
      break;
    } catch (e) {}
  }
  return xhr;
};

ajax.send = function(params) {
  var _async = params.async;

  if (_async === undefined) {
    _async = true;
  }

  var x = ajax.x();
  x.open(params.method, params.url, _async);
  x.onreadystatechange = function() {
    if (x.readyState == 4) {
      var status = x.status;
      if (status >= 200 && status < 300) {
        params.success && params.success(x.responseText, x.responseXML);
      } else {
        params.error && params.error(status);
      }
    }
  };
  if (params.method == 'POST') {
    x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  }
  x.send(params.data);
};

ajax.get = function(params) {
  var query = this.format_params(params.data);
  params.method = 'GET';
  params.data = null;

  params.url = params.url + (query.length ? '?' + query : '');
  ajax.send(params);
};

ajax.post = function(params) {
  var query = this.format_params(params.data);
  params.method = 'POST';
  params.data = query.join('&');
  ajax.send(params);
};

ajax.format_params = function(object) {
  if (!object) {
    return '';
  }

  if (typeof object === 'string') {
    return encodeURI(object);
  }

  var pieces = [];

  for (i in object) {
    if (object.hasOwnProperty(i)) {
      pieces.push(encodeURIComponent(i) + '=' + encodeURIComponent(object[i]));
    }
  }

  pieces.push('_t=' + +new Date());

  return pieces.join('&');
};

ajax.jsonp = function(params) {
  //创建script标签并加入到页面中
  var callbackName = ('jsonp_' + Math.random()).replace('.', '');
  var head = document.getElementsByTagName('head')[0];
  if (!params.data) {
    params.data = {};
  }
  // 设置传递给后台的回调参数名
  params.data['callback'] = callbackName;
  var data = ajax.format_params(params.data);
  var script = document.createElement('script');
  head.appendChild(script);

  //创建jsonp回调函数
  window[callbackName] = function(json) {
    head.removeChild(script);
    clearTimeout(script.timer);
    window[callbackName] = null;
    params.success && params.success(json);
  };

  //发送请求
  script.src = params.url + '?' + data;

  //超时处理
  if (params.time) {
    script.timer = setTimeout(function() {
      window[callbackName] = null;
      head.removeChild(script);
      params.error &&
        params.error({
          message: '超时'
        });
    }, params.time);
  }
};