Ajax

Ajax

Ajax(Asynchronous Javascript And XML) 即异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术。与以往传统网页相比,Ajax在更新网页时,不需要重新加载网页的情况下,更新部分网页内容。这样的方式可以给我们带来更好的客户体验!当然,Ajax也有同步请求方式,只是用的更多的是异步请求方式。那么下面在介绍是主要以异步为主。
首先,一项值得推广的技术在普及过程,为了更方便管理维护,当然是要将它封装成一个函数啦!在这个深入学习的过程,根据需求不断优化,Ajaxy有了五个版本的封装。下面逐一介绍:

Ajax-1.0

初级阶段只是用于简单求取数据 很多数据均用默认方式,比如GET请求方法、异步请求方式、单一的回调函数等。

/************************************************************************
*     函数:ajax
*     功能:请求数据
*     参数:
*                url            请求数据的地址
*                callback       回调函数  一般用于处理请求回来的数据
************************************************************************/
function ajax(url, callback) {

    //1.创建对象
    var xhr = new XMLHttpRequest();
    
        //2.准备  
    xhr.open("GET", url, true);
    
        //3.发送
    xhr.send();
    
        //4.收获数据
    xhr.onreadystatechange = function() {
        
        if (xhr.readyState == 4 && xhr.status == 200) {

            var str = xhr.responseText;

            callback && callback(str);
        }
    }
}

Ajax-2.0

毕竟考虑到Ajax的完整性,让其具有更广泛的应用,于是有了2.0版本。 那么在传参数时,只需要传一个对象obj即可。

/*****************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      method      请求数据的方式,GET、POST
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 ****************************************************************************/

function ajax(obj) {
    
    //默认GET方法
    if (obj.method == undefined) {
        obj.method = "GET";
    }
    
    //默认异步请求方式
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    gkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk//设置请求地址
    var url = obj.url;
    if (obj.method == "GET") {
        url += "?"
        url += obj.data;
    }
    
    xhr.open(obj.method, url, obj.async);

    if (obj.method == "POST") {
        //请求头
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(obj.data)
    } else {
        xhr.send()
    }
    
    //异步请求时
    //hr.readyState == 4 是表示后台处理完成了。 xhr.status == 200 是表示处理的结果是OK的。
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {//4 (完成):已经接收到了全部数据,并且连接已经关闭。
                
                if (xhr.status == 200) {// 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
                    
                    var str = xhr.responseText;//保存获取的数据
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

Ajax-3.0

到第三个版本,我们不再使用函数封装的方式,而是将Ajax定义为一个对象,并将GET和POST定义为两种方法,那么可以根据需求调用任一种方法,与此类似的方法也可以这样定义,那么在使用时就可以根据需求调用对应的方法,并且还可以在Ajax里面定义对象。

//定义一个对象
var ajax = {}

// 增加1个方法: get方法
/*******************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 ******************************************************************************/
ajax.get = function() {
    
    //默认异步请求方式
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    url += "?"
    url += obj.data;
    
    xhr.open("GET", url, obj.async);
    
    xhr.send()
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

// 增加1个方法: post方法
/*******************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 ******************************************************************************/
ajax.post = function() {
    
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    
    xhr.open("GET", url, obj.async);

    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(obj.data)
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

Ajax-4.0

用对象封装函数则考虑一个变量被覆盖的问题,因为在调用方法时,我们并不清楚,Ajax中有用了哪些 变量,考虑到HTML文件与Ajax变量名相同而影响到对象的情况存在,例如下面a,下面采用面向对象的形式封装。于是有了下一个4.0版本。

// 函数封装的是代码,采用面向对象的形式封装

(function () {

var a = 100;


// 暴露出ajax接口
ajax = window.ajax = {}

// 增加1个方法: get方法
/*******************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 *****************************************************************************/
ajax.get = function() {
    
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    url += "?"
    url += obj.data;
    
    xhr.open("GET", url, obj.async);
    
    xhr.send()
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

// 增加1个方法: post方法
/******************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 *****************************************************************************/
ajax.post = function() {
    
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    
    xhr.open("POST", url, obj.async);

    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(obj.data)
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

})();

Ajax-5.0

做到第四个版本时候,我们就发现,在传入一个对象的过程,由于对象地址拼接过程比较复杂,也比较长,稍一个不注意就会出错,为了解决这个问题,我们又想到了对象,传入地址的键值对以对象的方式传,在对象Ajax中增加一个方法,用于拼接地址。于是就是下面的5.0版本出炉。

(function () {

// 暴露出ajax接口
ajax = window.ajax = {}

// 增加1个方法: get方法
/*********************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据, 要求格式是 对象
 *                      例如  {type:"send"} , {type:"send", msg: "GG啦~"}
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 *********************************************************************************/
ajax.get = function(obj) {
    
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    url += "?";
    //  translate 自定义的函数,将对象 转换成拼接字符串
    url += translate(obj.data);
    
    xhr.open("GET", url, obj.async);
    
    xhr.send()
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

// 增加1个方法: post方法
/*******************************************************************************
 * 参数:
 *   obj 是1个对象,代表参数的集合,里面有很多参数,如下所示:
 *      url         请求的地址与参数
 *      data        发送的数据
 *      async       是否是同步,  true / false
 *      fail        失败的处理回调函数
 *      success     成功的处理回调函数
 ******************************************************************************/
ajax.post = function(obj) {
    
    if (obj.async == undefined) {
        obj.async = true;
    }
    
    if (obj.data == undefined) {
        obj.data = "";
    }
    
    var xhr = new XMLHttpRequest();
    
    var url = obj.url;
    
    xhr.open("POST", url, obj.async);

    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(obj.data)
    
    if (obj.async == true) {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                
                if (xhr.status == 200) {
                    
                    var str = xhr.responseText;
                    obj.success && obj.success(str);
                } else {
                    obj.fail && obj.fail();
                }
                
            }
            
        }
    } else {
        // 同步方式
        if (xhr.status == 200) {
            var str = xhr.responseText;
            obj.success && obj.success(str);
        } else {
            obj.fail && obj.fail();
        }
    }
    
}

// 定义函数
function translate(obj) {
    var str = "";
    for (var i in obj) {
        
        str += i;      // 拼接属性名     type
        str += "=";    // 拼接=       =
        str += encodeURIComponent(obj[i])  // 拼接属性值     send
        str += "&";    // 拼接&       &
    }
    
    // 删除最后1个字符
    str = str.substr(0, str.length-1);
    
     return str;
}

// 调用函数,因为定义和调用在同一个空间,这是可以调用的
// translate({})

})();

那么,往后还是可以不断优化,让Ajax更普及。值得注意的是,Ajax每使用一次,就会发送一次请求,于是可以在全局定义一个数组,用于存放请求来的信息,执行前先来一个判断,当该数组有值时,不需再请求,而是直接使用,那么久节省了内存,nice!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,146评论 0 7
  • Ajax的基本概念及使用 同步&异步 同步:必须等待前面的任务完成,才能继续后面的任务; 异步:不受当前主要任务的...
    magic_pill阅读 1,933评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • 大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师...
    大大头大阅读 7,448评论 1 72
  • 我有一个伟大的创意。 手表要是有一个,英汉互译发音的功能就好了。 因为一天24小时,只有手表会随身带着,要是有这个...
    Enyamoon阅读 232评论 0 0