博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js封装 Ajax ——常用工具函数
阅读量:6639 次
发布时间:2019-06-25

本文共 7301 字,大约阅读时间需要 24 分钟。

在前端开发中,ajax的重要性不言而喻,所以我开始试着封装自己专属ajax

1.常规封装

/* 封装ajax函数 * @param {string}opt.method http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的 * @param {object}opt.data 发送的参数,格式为对象类型 * @param {function}opt.success ajax发送并接收成功调用的回调函数 *//*1常规封装*/function ajax(opt) {    opt = opt || {};    opt.method = opt.method.toUpperCase() || "GET"; //GET:用"GET"方式发送数据,只能256KB;POST:用"POST"方式发送数据,可以大到4MB    opt.url = opt.url || "";    opt.async = opt.async || true; //同步异步    opt.dataType = opt.dataType || "text"; //所传的数的数据类型    opt.contentType = opt.contentType || "application/x-www-form-urlencoded; charset=utf-8"; //默认表单格式 opt.dataType='json'    opt.data = opt.data || null;    var xmlHttp = getXmlHttp(); //获取XML 对象    var postData = getAjaxParama(opt.data); //data    if (opt.contentType === "application/json;charset=utf-8" && opt.dataType === "json") {        postData = JSON.stringify(opt.data); //转化为字符串    }    if (opt.method === 'POST') {        xmlHttp.open(opt.method, opt.url, opt.async);        xmlHttp.setRequestHeader('Content-Type', opt.contentType); //而POST请求需要设置请求头,用来传递参数    } else if (opt.method === 'GET') {        postData = opt.url.indexOf("?") >= 0 ? "&" + postData : "?" + postData; //GET请求,参数是拼接到url上面;        xmlHttp.open(opt.method, opt.url + postData, opt.async);        postData = null; //重置参数    }    xmlHttp.onreadystatechange = function() {        if (xmlHttp.readyState == 4) {            var status = xmlHttp.status;            if (status >= 200 && status < 300) {                opt.success && opt.success(xmlHttp.responseText);            } else {                opt.error && opt.error(status);            }        }    };    xmlHttp.send(postData);    function getXmlHttp() {        var obj = null;        //非IE浏览器创建XmlHttpRequest对象        if (window.XMLHttpRequest) obj = new XMLHttpRequest();        //IE浏览器创建XmlHttpRequest对象        if (window.ActiveXObject) {            try {                obj = new ActiveXObject('Microsoft.XMLHTTP');            } catch (e) {                try {                    obj = new ActiveXObject("msxml2.XMLHTTP");                } catch (ex) {}            }        }        return obj;    }    function getAjaxParama(data) {        var params = [];        for (var key in data) {            params.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));        }        return params.join('&'); //添加&字符串    }}

2.自定义封装

/** * [ajax封装ajax函数] * @Author   Linada * @DateTime 2017-12-19T16:16:32+0800 * @param {string}  opt.method [http连接的方式,包括POST和GET两种方式] * @param {string}  opt.url [发送请求的url] * @param {boolean} opt.async [是否为异步请求,true为异步的,false为同步的] * @param {object}  opt.data [发送的参数,格式为对象类型] * @param {function}  opt.success [ajax发送并接收成功调用的回调函数] */;(function (undefined) {    "use strict"    var _global;    var umeAjax = {        ajax: function (opt) {            opt = opt || {};            opt.method = opt.method.toUpperCase() || "GET"; //GET:用"GET"方式发送数据,只能256KB;POST:用"POST"方式发送数据,可以大到4MB            opt.url = opt.url || "";            opt.async = opt.async || true; //同步异步            opt.dataType = opt.dataType || "text"; //所传的数的数据类型            opt.contentType = opt.contentType || "application/x-www-form-urlencoded; charset=utf-8"; //默认表单格式 opt.dataType='json'            opt.data = opt.data || null;            var xmlHttp = getXmlHttp(); //获取XML 对象            var postData = getAjaxParama(opt.data); //data            if (opt.contentType === "application/json;charset=utf-8" && opt.dataType === "json") {                postData = JSON.stringify(opt.data); //转化为字符串            }            if (opt.method === 'POST') {                xmlHttp.open(opt.method, opt.url, opt.async);                xmlHttp.setRequestHeader('Content-Type', opt.contentType); //而POST请求需要设置请求头,用来传递参数            } else if (opt.method === 'GET') {                postData = opt.url.indexOf("?") >= 0 ? "&" + postData : "?" + postData; //GET请求,参数是拼接到url上面;                xmlHttp.open(opt.method, opt.url + postData, opt.async);                postData = null; //重置参数            }            xmlHttp.onreadystatechange = function () {                if (xmlHttp.readyState == 4) {                    var status = xmlHttp.status;                    if (status >= 200 && status < 300) {                        opt.success && opt.success(xmlHttp.responseText);                    } else {                        opt.error && opt.error(status);                    }                }            };            xmlHttp.send(postData);        },    }    function getXmlHttp() {        var obj = null;        //非IE浏览器创建XmlHttpRequest对象        if (window.XMLHttpRequest) obj = new XMLHttpRequest();        //IE浏览器创建XmlHttpRequest对象        if (window.ActiveXObject) {            try {                obj = new ActiveXObject('Microsoft.XMLHTTP');            } catch (e) {                try {                    obj = new ActiveXObject("msxml2.XMLHTTP");                } catch (ex) {                }            }        }        return obj;    }    function getAjaxParama(data) {        var params = [];        for (var key in data) {            params.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));        }        return params.join('&'); //添加&字符串    }    // 最后将插件对象暴露给全局对象    _global = (function () {        return this || (0, eval)('this');    }());    if (typeof module !== "undefined" && module.exports) {        module.exports = umeAjax;    } else if (typeof define === "function" && define.amd) {        define(function () {            return umeAjax;        });    } else {        !('umeAjax' in _global) && (_global.umeAjax = umeAjax);    }}());

3.使用

    
js测试

4.拓展

封装post方式的promise的ajax插件

/**promise* 用Promise封装一个post请求的方法*/function postJSON(url, data) {    return new Promise(function(resolve, reject) {        var xhr = new XMLHttpRequest();        xhr.open("POST", url, true);        xhr.setRequestHeader("Content-type", "application/json;charset=utf-8");        xhr.onreadystatechange = function() {            if (this.readyState === 4) {                if (this.status === 200) {                    resolve(JSON.parse(this.responseText), this);                    //debug_print("ajaxPromise(param) success: " +this.responseText);                } else {                    var resJson = {                        code: this.status,                        response: this.response                    };                    reject(resJson, this);                }            }        };        xhr.send(JSON.stringify(data));    });}// 用Promise封装一个get请求的方法,基于ajaxfunction ajaxPromise(param) {    return new Promise(function (resolve, reject) {        $.ajax({            url: param.url,            type: 'get',            data: param.data || '',            success: function (data) {                //console.info(data);                debug_print("ajaxPromise(param) success: " + JSON.stringify(data));                resolve(data);            },            error: function (error) {                //console.info(error);                debug_print("ajaxPromise(param) error: " + JSON.stringify(error));                reject(error)            }        });    });}

转载地址:http://etovo.baihongyu.com/

你可能感兴趣的文章
iOS关于sqlite3操作(转)
查看>>
substr(),mb_substr()及mb_strcut的区别和用法
查看>>
第二代支付系统专题之报文篇(一)小额支付报文完整版(含二代新增功能业务说明)...
查看>>
jQuery 获取URL的GET参数值
查看>>
FCKEditor使用说明
查看>>
节点遍历测试dom4j创建、修改、遍历XML
查看>>
post和get
查看>>
宋体语句那些苦逼日子的学习(C语言)06
查看>>
Linux中的计划任务at命令的用法
查看>>
使用游标——游标FOR循环
查看>>
5月收集
查看>>
Javascript获取DropDownList选项信息
查看>>
javaScript 正则表达式2
查看>>
原创:Qt自定义拖放
查看>>
策略模式
查看>>
(转)RGB接口和i80接口的区别
查看>>
6月21小记
查看>>
RESTful API 设计最佳实践
查看>>
定义文件XML——从简单开始
查看>>
android辅助开发工具包介绍
查看>>