zoukankan      html  css  js  c++  java
  • 封装ajax支持get、post

    为什么要封装ajax,因为……

    for(var i=0;i<20;i++){

      $.ajax(……)

    }

    的时候,整个页面都卡死了,于是,我开始找答案。

    后来,找到了,就是jquery的ajax属于全局,当上文不执行完毕,其他的都动不了。于是乎有了封装ajax,将ajax作为局部使用,即可解决掉。

            function ajax(options) {
                    options = options || {};
                    options.type = (options.type || "GET").toUpperCase();
                    options.dataType = options.dataType || "json";
                    var params = formatParams(options.data);
    
                    var xhr;
                    //第一步
                    if (window.ActiveXObject) {//返回true为ie浏览器内核,否则不是ie内核
                        //为ie内核创建传输对象的方式 
                        xhr = new window.ActiveXObject("Microsoft.XMLHTTP");
                    } else {
                        //为非ie 内核浏览器创建传输对象的方式
                        xhr = new XMLHttpRequest();
                    }
    
                    //接收 - 第三步
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == 4) {
                            var status = xhr.status;
                            if (status >= 200 && status < 300) {
                                options.success && options.success(xhr.responseText, xhr.responseXML);
                            } else {
                                options.error && options.error(status);
                            }
                        }
                    }
    
                    //连接 和 发送 - 第二步
                    if (options.type == "GET") {
                        xhr.open("GET", options.url + "?" + params, true);
                        xhr.send(null);
                    } else if (options.type == "POST") {
                        xhr.open("POST", options.url, true);
                        //设置表单提交时的内容类型
                        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                        xhr.send(params);
                    }
                }
                //格式化参数
                function formatParams(data) {
                    var arr = [];
                    for (var name in data) {
                        arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
                    }
                    arr.push(("v=" + Math.random()).replace(".", ""));
                    return arr.join("&");
                }
    

      还有一个精简后的

    function ajax(opt) {
            opt = opt || {};
             opt.method = opt.method.toUpperCase() || 'POST';
             opt.url = opt.url || '';
             opt.async = opt.async || true;
             opt.data = opt.data || null;
            opt.success = opt.success || function () {};
             var xmlHttp = null;
             if (XMLHttpRequest) {
                 xmlHttp = new XMLHttpRequest();
             }
             else {
                 xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
             }var params = [];
             for (var key in opt.data){
                 params.push(key + '=' + opt.data[key]);
             }
             var postData = params.join('&');
             if (opt.method.toUpperCase() === 'POST') {
                 xmlHttp.open(opt.method, opt.url, opt.async);
                 xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
                 xmlHttp.send(postData);
             }
             else if (opt.method.toUpperCase() === 'GET') {
                 xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
                 xmlHttp.send(null);
             }
             xmlHttp.onreadystatechange = function () {
                 if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                     opt.success(xmlHttp.responseText);
                 }
             };
         }
    

      但是呢,如果用惯了jq的,我们其实也可以这样封装

    function ajax(){ 
      var ajaxData = { 
        type:arguments[0].type || "GET", 
        url:arguments[0].url || "", 
        async:arguments[0].async || "true", 
        data:arguments[0].data || null, 
        dataType:arguments[0].dataType || "text", 
        contentType:arguments[0].contentType || "application/x-www-form-urlencoded", 
        beforeSend:arguments[0].beforeSend || function(){}, 
        success:arguments[0].success || function(){}, 
        error:arguments[0].error || function(){} 
      } 
      ajaxData.beforeSend() 
      var xhr = createxmlHttpRequest();  
      xhr.responseType=ajaxData.dataType; 
      xhr.open(ajaxData.type,ajaxData.url,ajaxData.async);  
      xhr.setRequestHeader("Content-Type",ajaxData.contentType);  
      xhr.send(convertData(ajaxData.data));  
      xhr.onreadystatechange = function() {  
        if (xhr.readyState == 4) {  
          if(xhr.status == 200){ 
            ajaxData.success(xhr.response) 
          }else{ 
            ajaxData.error() 
          }  
        } 
      }  
    } 
      
    function createxmlHttpRequest() {  
      if (window.ActiveXObject) {  
        return new ActiveXObject("Microsoft.XMLHTTP");  
      } else if (window.XMLHttpRequest) {  
        return new XMLHttpRequest();  
      }  
    } 
      
    function convertData(data){ 
      if( typeof data === 'object' ){ 
        var convertResult = "" ;  
        for(var c in data){  
          convertResult+= c + "=" + data[c] + "&";  
        }  
        convertResult=convertResult.substring(0,convertResult.length-1) 
        return convertResult; 
      }else{ 
        return data; 
      } 
    }
    

      调用方法就很简单了,看看需要的参数就知道了。

  • 相关阅读:
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Bound mismatch: The typae CertificateDirectory is not a valid substitute for the bounded parameter <M extends Serializable>
    Duplicate property mapping of contactPhone found in
  • 原文地址:https://www.cnblogs.com/webSong/p/7224546.html
Copyright © 2011-2022 走看看