原生ajax实现

166 阅读1分钟

原生js代码实现ajax

```ajax: function (cObj) {
      var thisTemp = this;
      var callback = null;
      var obj = {
            method: "get",
            dataType: "json",
            charset: "utf-8",
            async: false,
            url: "",
            data: null,
            success: null,
            error: null,
       };
      if (this.varType(cObj) != "object") {
        this.eject(this.errorList[9]);
        return;
      }
      obj = this.standardization(obj, cObj);
      if (
        obj.dataType === "json" ||
        obj.dataType === "text" ||
        obj.dataType === "html" ||
        obj.dataType === "xml"
      ) {
        var xhr = this.createXHR();
        callback = function () {
          if (xhr.status == 200) {
            if (thisTemp.isUndefined(obj.success)) {
              return;
            }
            if (obj.dataType === "json") {
              try {
                obj.success(eval("(" + xhr.responseText + ")"));
              } catch (event) {
                if (!thisTemp.isUndefined(obj["error"])) {
                  obj.error(event);
                }
              }
            } else {
              obj.success(xhr.responseText);
            }
          } else {
            obj.success(null);
            thisTemp.eject(thisTemp.errorList[10], "Ajax.status:" + xhr.status);
          }
        };
        obj.url =
          obj.url.indexOf("?") == -1
            ? obj.url + "?rand=" + this.randomString(6)
            : obj.url;
        obj.data = this.formatParams(obj.data);
        if (obj.method === "get" && !this.isUndefined(obj.data)) {
          if (obj.data != "") {
            if (obj.url.indexOf("?") == -1) {
              obj.url += "?" + obj.data;
            } else {
              obj.url += "&" + obj.data;
            }
          }
        }
        if (obj.async === true) {
          xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && callback != null) {
              callback();
            }
          };
        }
        xhr.open(obj.method, obj.url, obj.async);
        if (obj.method === "post") {
          try {
            xhr.setRequestHeader(
              "Content-Type",
              "application/x-www-form-urlencoded"
            );
            xhr.setRequestHeader("charset", obj["charset"]);
            xhr.send(obj.data);
          } catch (event) {
            callback();
          }
        } else {
          try {
            xhr.send(null);
          } catch (event) {
            callback();
          }
        }
        if (obj.async === false) {
          callback();
        }
      } else if (obj.dataType === "jsonp") {
        var oHead = document.getElementsByTagName("head")[0];
        var oScript = document.createElement("script");
        var callbackName = "callback" + new Date().getTime();
        var params = this.formatParams(obj.data) + "&callback=" + callbackName;
        callback = obj.success;
        oScript.src = obj.url.split("?") + "?" + params;
        oHead.insertBefore(oScript, oHead.firstChild);
        window[callbackName] = function (json) {
          callback(json);
          oHead.removeChild(oScript);
        };
      }
    },
   
   
   这段代码是取自ckplayer的源码片段----发现源码里面有很多很香的东西,先把代码粘贴在这里,后期会更新自己对这段代码的学习理解。