[转载]ecshop中的Ajax.call定义及讲解_活在当下,展现自我。_百度空间

[转载]ecshop中的Ajax.call定义及讲解_活在当下,展现自我。_百度空间.

在ECShop中,经常看到这样的定义:

Ajax.call(‘api_tb_goods_upload.php?is_ajax=1&&act=get_goods_list’, filters1, queryGoodsResponse , ‘POST’, ‘JSON’);

其中,Ajax.call是ecshop中的非常重要的ajax回调函数。

 

该函数定义在:

js / transport.js

代码如下:

var Transport =
{
/* *
* 存储本对象所在的文件名。
*
* @static
*/
filename : "transport.js",

/* *
* 存储是否进入调试模式的开关,打印调试消息的方式,换行符,调试用的容器的ID。
*
* @private
*/
debugging :
{
    isDebugging : 0,
    debuggingMode : 0,
    linefeed : "",
    containerId : 0
},

/* *
* 设置调试模式以及打印调试消息方式的方法。
*
* @public
* @param   {int}   是否打开调试模式      0:关闭,1:打开
* @param   {int}   打印调试消息的方式    0:alert,1:innerHTML
*
*/
debug : function (isDebugging, debuggingMode)
{
    this.debugging =
    {
      "isDebugging" : isDebugging,
      "debuggingMode" : debuggingMode,
      "linefeed" : debuggingMode ? "<br />" : "\n",
      "containerId" : "dubugging-container" + new Date().getTime()
    };
},

/* *
* 传输完毕后自动调用的方法,优先级比用户从run()方法中传入的回调函数高。
*
* @public
*/
onComplete : function ()
{
},

/* *
* 传输过程中自动调用的方法。
*
* @public
*/
onRunning : function ()
{
},

/* *
* 调用此方法发送HTTP请求。
*
* @public
* @param   {string}    url             请求的URL地址
* @param   {mix}       params          发送参数
* @param   {Function} callback        回调函数
* @param   {string}    ransferMode     请求的方式,有"GET"和"POST"两种
* @param   {string}    responseType    响应类型,有"JSON"、"XML"和"TEXT"三种
* @param   {boolean}   asyn            是否异步请求的方式
* @param   {boolean}   quiet           是否安静模式请求
*/
run : function (url, params, callback, transferMode, responseType, asyn, quiet)
{
    /* 处理用户在调用该方法时输入的参数 */
    params = this.parseParams(params);
    transferMode = typeof(transferMode) === "string"
    && transferMode.toUpperCase() === "GET"
    ? "GET"
    : "POST";

    if (transferMode === "GET")
    {
      var d = new Date();

      url += params ? (url.indexOf("?") === - 1 ? "?" : "&") + params : "";
      url = encodeURI(url) + (url.indexOf("?") === - 1 ? "?" : "&") + d.getTime() + d.getMilliseconds();
      params = null;
    }

    responseType = typeof(responseType) === "string" && ((responseType = responseType.toUpperCase()) === "JSON" || responseType === "XML") ? responseType : "TEXT";
    asyn = asyn === false ? false : true;

    /* 处理HTTP请求和响应 */
    var xhr = this.createXMLHttpRequest();
    try
    {
      var self = this;

   /**/
      if (typeof(self.onRunning) === "function" && !quiet)
      {
        self.onRunning();
      }
       //alert(url);
      xhr.open(transferMode, url, asyn);
     
      if (transferMode === "POST")
      {
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      }
  
      if (asyn)
      {
        xhr.onreadystatechange = function (){
          
          if (xhr.readyState == 4){
    
            switch ( xhr.status ){
              case 0:
              case 200: // OK!
                if (typeof(self.onComplete) === "function"){
                  self.onComplete();
       //alert(1);
                }

                if (typeof(callback) === "function"){
                  callback.call(self, self.parseResult(responseType, xhr), xhr.responseText);
       //alert(2);
                }
              break;
              case 304: // Not Modified
              break;
              case 400: // Bad Request
                 alert("XmlHttpRequest status: [400] Bad Request");
              break;
              case 404: // Not Found
                alert("XmlHttpRequest status: [404] \nThe requested URL "+url+" was not found on this server.");
              break;
              case 409: // Conflict
              break;
              case 503: // Service Unavailable
                 alert("XmlHttpRequest status: [503] Service Unavailable");
              break;
              default:
                 alert("XmlHttpRequest status: [" + xhr.status + "] Unknow status.");
            }
            xhr = null;
          }
        }
        if (xhr != null) xhr.send(params);
      }
      else
      {
      /**/
        if (typeof(self.onRunning) === "function")
        {
          self.onRunning();
        }
        xhr.send(params);
       
        var result = self.parseResult(responseType, xhr);
        //xhr = null;
        if (typeof(self.onComplete) === "function")
        {
          self.onComplete();
        }
        if (typeof(callback) === "function")
        {
          callback.call(self, result, xhr.responseText);
        }

        return result;
      }
    }
    catch (ex)
    {
      if (typeof(self.onComplete) === "function")
      {
        self.onComplete();
      }

      alert(this.filename + "/run() error:" + ex.description);
    }
},

/* *
* 如果开启了调试模式,该方法会打印出相应的信息。
*
* @private
* @param   {string}    info    调试信息
* @param   {string}    type    信息类型
*/
displayDebuggingInfo : function (info, type)
{
    if ( ! this.debugging.debuggingMode)
    {
      alert(info);
    }
    else
    {

      var id = this.debugging.containerId;
      if ( ! document.getElementById(id))
      {
        div = document.createElement("DIV");
        div.id = id;
        div.style.position = "absolute";
        div.style.width = "98%";
        div.style.border = "1px solid #f00";
        div.style.backgroundColor = "#eef";
        var pageYOffset = document.body.scrollTop
        || window.pageYOffset
        || 0;
        div.style.top = document.body.clientHeight * 0.6
        + pageYOffset
        + "px";
        document.body.appendChild(div);
        div.innerHTML = "<div></div>"
        + "<hr style='height:1px;border:1px dashed red;'>"
        + "<div></div>";
      }

      var subDivs = div.getElementsByTagName("DIV");
      if (type === "param")
      {
        subDivs[0].innerHTML = info;
      }
      else
      {
        subDivs[1].innerHTML = info;
      }
    }
},

/* *
* 创建XMLHttpRequest对象的方法。
*
* @private
* @return      返回一个XMLHttpRequest对象
* @type    Object
*/
createXMLHttpRequest : function ()
{
    var xhr = null;

    if (window.ActiveXObject)
    {
      var versions = ['Microsoft.XMLHTTP', 'MSXML6.XMLHTTP', 'MSXML5.XMLHTTP', 'MSXML4.XMLHTTP', 'MSXML3.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML.XMLHTTP'];

      for (var i = 0; i < versions.length; i ++ )
      {
        try
        {
          xhr = new ActiveXObject(versions[i]);
          break;
        }
        catch (ex)
        {
          continue;
        }
      }
    }
    else
    {
      xhr = new XMLHttpRequest();
    }

    return xhr;
},

/* *
* 当传输过程发生错误时将调用此方法。
*
* @private
* @param   {Object}    xhr     XMLHttpRequest对象
* @param   {String}    url     HTTP请求的地址
*/
onXMLHttpRequestError : function (xhr, url)
{
    throw "URL: " + url + "\n"
    + "readyState: " + xhr.readyState + "\n"
    + "state: " + xhr.status + "\n"
    + "headers: " + xhr.getAllResponseHeaders();
},

/* *
* 对将要发送的参数进行格式化。
*
* @private
* @params {mix}    params      将要发送的参数
* @return 返回合法的参数
* @type string
*/
parseParams : function (params)
{
    var legalParams = "";
    params = params ? params : "";

    if (typeof(params) === "string")
    {
      legalParams = params;
    }
    else if (typeof(params) === "object")
    {
      try
      {
        legalParams = "JSON=" + obj2str(params);
      }
      catch (ex)
      {
        alert("Can't stringify JSON!");
        return false;
      }
    }
    else
    {
      alert("Invalid parameters!");
      return false;
    }

    if (this.debugging.isDebugging)
    {
      var lf = this.debugging.linefeed,
      info = "[Original Parameters]" + lf + params + lf + lf
      + "[Parsed Parameters]" + lf + legalParams;

      this.displayDebuggingInfo(info, "param");
    }
    return legalParams;
},

/* *
* 对返回的HTTP响应结果进行过滤。
*
* @public
* @params   {mix}   result   HTTP响应结果
* @return 返回过滤后的结果
* @type string
*/
preFilter : function (result)
{
    return result.replace(/\xEF\xBB\xBF/g, "");
},

/* *
* 对返回的结果进行格式化。
*
* @private
* @return 返回特定格式的数据结果
* @type mix
*/
parseResult : function (responseType, xhr)
{
    var result = null;
    switch (responseType)
    {
      case "JSON" :
     
        result = this.preFilter(xhr.responseText);
       
        try
        {
          result = result.parseJSON();
        }
        catch (ex)
        {
          throw this.filename + "/parseResult() error: can't parse to JSON.\n\n" + xhr.responseText;
        }
        break;
      case "XML" :
        result = xhr.responseXML;
        break;
      case "TEXT" :
        result = this.preFilter(xhr.responseText);
        break;
      default :
        throw this.filename + "/parseResult() error: unknown response type:" + responseType;
    }
   
    if (this.debugging.isDebugging)
    {
  
  
      var lf = this.debugging.linefeed,
      info = "[Response Result of " + responseType + " Format]" + lf
      + result;

      if (responseType === "JSON")
      {
        info = "[Response Result of TEXT Format]" + lf
        + xhr.responseText + lf + lf
        + info;
      }

      this.displayDebuggingInfo(info, "result");
    }

  
    return result;
}
};

/* 定义两个别名 */
var Ajax = Transport;
Ajax.call = Transport.run;
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏