在前端开发中,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"方式发送数据,可以大到4MBopt.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); //dataif (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"方式发送数据,可以大到4MBopt.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); //dataif (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.使用

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>js测试</title><meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/><meta name="description" content="my fortune" /><style>        html {font-size: 24px!important;padding-bottom: 0;}        </style>
</head><body><div id="ajax"></div><script src="./ajax.js"></script>    <script type="text/javascript">var country = "US";var lan = "en";var news_url = "https://contentapi.celltick.com/mediaApi/v1.0/notification";ajax({method: "GET",data: {publisherId: "ZTE-Push",key: "ZPaP5GSQzmg41tHF0h7Jv0u2SOuH4OM4",limit: 10,userId: "572776656",countryCode: country,lanuguage: lan},url: news_url,success: function(response) {//console.log(response);document.getElementById("ajax").innerHTML=response;},error: function(e) {console.log(e);}});</script><script src="./ajax.fn.js"></script><script type="text/javascript">umeAjax.ajax({method: "GET",data: {publisherId: "ZTE-Push",key: "ZPaP5GSQzmg41tHF0h7Jv0u2SOuH4OM4",limit: 10,userId: "572776656",countryCode: country,lanuguage: lan},url: news_url,success: function(response) {console.log("umeAjax: "+response.length);},error: function(e) {console.log(e);}});var getAdUrl = "http://browser.umeweb.com/cn_ume_api/ads/api/request"; //ajax参数umeAjax.ajax({method: 'POST',url: getAdUrl,contentType: "application/json;charset=utf-8",data:{"app": {"sdk_channel": "","app_id": "","app_version": "","app_package": ""},"addes": [{"ad_type": 2,"impression_num": 3,"ad_slot": 2,"ad_width": 0,"ad_height": 0}],"device": {"screen_width": 1280,"screen_height": 720,"os_type": 2,"imei": "864783024054476","device_type": 2,"androidid": "f58d85c248c37836","model": "HLANOTE1-L","os_version": "","hardware": "mt6752","display": "HLANOTE1-L-V1.0","total_rom": "3047200","board": "techain6752_lt_kk","total_ram": "1961972","product": "HLANOTE1-L","manufacturer": "YUSUN","device": "HLANOTE1-L","brand": "YUSUN","mac": "e8:92:a4:99:6f:00"},"user": {"ip": "115.239.210.20","uid": "","imsi": "460016131813183","networktype": 1,"lang": "zh_CN"} },dataType: 'json',success: function(data) {var obj = JSON.parse(data);if (obj.retcode == "0" && obj.ads.length > 0) {console.info("广告API请求成功:"+ JSON.stringify(obj));} else {console.info("请求成功,数据异常 :"+ JSON.stringify(obj));}},fail: function(e) {console.info("请求错误,错误信息:"+e);}});</script></body>
</html>

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请求的方法,基于ajax
function 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)}});});
}

js封装 Ajax ——常用工具函数相关推荐

  1. js插件编写常用工具函数及格式

    一.基本格式 1 ;(function(undefined) { 2 "use strict" 3 var _global; 4 5 var plugin = { 6 add: f ...

  2. js 封装ajax方法吗,原生JS封装ajax方法

    jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只需要ajax,这时引入jquery库会造成资源浪费,也会显得页面臃肿.这时我们就 ...

  3. part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)...

    循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部 ...

  4. TensorFlow 高维tenso常用工具函数

    tensorflow 常用工具函数 1. shape 重定义: tf.reshape() 2. 维度交换: tf.transpose() 3. 维度扩充: tf.expand_dims() 4. 维度 ...

  5. 原生JS封装Ajax插件(同域jsonp跨域)

    2019独角兽企业重金招聘Python工程师标准>>> 抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax ...

  6. 原生JS写Ajax的请求函数

    本文主要介绍了如何通过原生JavaScript封装ajax请求,文中给出了具体的实现代码和详细的解释,希望对你有所帮助. 一.JS原生Ajax ajax:一种请求数据的方式,不需要刷新整个页面: aj ...

  7. 原生JS封装ajax方法

    http://blog.sucaijiayuan.com/article/89 jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只 ...

  8. 【嵌入式C语言】常用工具函数之数字字符串与十进制数字转换函数

    背景:在嵌入式开发中,有时候我们在协议中发送或者收到的数字都是十进制数字,而我们在人机交互时,需用通过字符串类型来显示该十进制数字,这就经常需要对十进制数字和数字字符串进行相互转换. 说明:下面给出的 ...

  9. vue 封装js常用工具函数包

    1.邮箱export const isEmail = (s) => {return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3 ...

  10. 推荐一个js常用工具函数库

    etools 常用js函数整理 安装和使用 使用npm安装:npm install -s etools 通过es6模块引入,如import _ from "etools";cons ...

最新文章

  1. 浅谈机器学习在市场营销中的应用
  2. Python基础(1)
  3. 1018 Public Bike Management (30 分) 【难度: 难 / 知识点: 图论 最短路 图的遍历】
  4. java 属性不序列化_怎样对带有不可序列化属性的Java对象进行序列化
  5. 微信web-view 开发_在不到7个月的时间里我如何成为一名Web开发人员-以及如何
  6. Java实现计算饮料价格GUI版(入门)
  7. 【零基础学Java】—对象的内存图(八)
  8. 转换和删除重复命令tr
  9. gateway权限统一认证
  10. SPSS做因子分析(非常细致的过程)
  11. 利用python将Mooc缓存转换为视频文件
  12. premiere学习笔记01帧定格,时间码,透明视频,调整图层,转场及批量转场,插件安装,音频调整,关键帧,马赛克,蒙版,嵌套序列
  13. 迅雷手机版苹果版_免费下载迅雷 iOS 版
  14. 文件系统FatFsR0.09a翻译(三):ff.h
  15. python股票量化投资刑不行_【邢不行|量化小讲堂系列10-Python量化入门】量化投资中如何处理复权、除权问题...
  16. 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
  17. 低成本DC/DC转换器34063的应用(图)
  18. 《草根自媒体达人运营实战》一一1.3 各种自媒体平台及优缺点
  19. Heckman两步法 | 样本选择模型 处理效应模型
  20. jeesite4 图片上传总结

热门文章

  1. 趣图:Linux 发行版之间的恶意竞争
  2. 考题篇(6.2) 01 ❀ FortiManager ❀ Fortinet 网络安全专家 NSE 5
  3. IT巨头英特尔看好中国市场前景
  4. 脑机接口系统的柔性电极概述
  5. 五、DMSP/OLS、NPP/VIIRS夜间灯光数据之建成区提取
  6. 云和恩墨助力GIAC:Oracle ACE李真旭将分享MySQL 8.0和Oracle Redo机制解析
  7. 拾方易商业wifi能否成为物联网入口
  8. (更新时间)2021年3月28日 python基础知识(闭包)
  9. IE浏览器右键菜单分享扩展
  10. 同事悄悄告诉我,飞书通知还能这样玩