仿jquery ajax,不过功能没那么多。贴代码

--------------------------------------分割线------------------------------------------

//MyXhr对象
var MyXhr = function(config){
this.config = config;
var that = this;
//默认配置项
defaultConfig = {
"options":{
"url" : "",//请求地址
"method" : "post",//get||post
"async" : true,//异步
"data" : [],//post请求数据
"timeout": 5000//超时时间
},
"success":function(){ },
"error":function(){ }
};
//合并配置项
var mergeConfig = this.config = this.extend(this.config, defaultConfig);
var xhr = this.createXhr(); //处理逻辑
var postData = null;
var url = mergeConfig.options.url;
if(mergeConfig.options.method == "post"){
//post 用formate传值,省去加header
postData = mergeConfig.options.data;
var formData = new FormData();
for(var item in postData){
formData.append(item, postData[item]);
}
postData = formData;
}else{
//get方式用参数名和参数值用encodeURIComponent()编码
url = this.dealUrl(url);
}
xhr.open(mergeConfig.options.method, url, mergeConfig.options.async); xhr.onreadystatechange = function(){
//监听状态 0=>为初始化 1=>启动 2=>发送 3=>接受 4=>完成
if(xhr.readyState == 4){
if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
that.config.success(xhr.responseText);
}else{
that.config.error()+xhr.status;
}
}
};
xhr.send(postData); //超时报错
xhr.ontimeout = function(){
throw new Error("connect timeout");
}
} /**以下为公共方法**/
//extend方法,与$.extend()相同
MyXhr.prototype.extend = function (p1, p2){
var p = (function loop(p1, p2){
var p = {};//返回值
for(var item in p2){
//如果是对象再次递归调用函数
if(typeof p2[item]==='object'){
p[item] = loop(p1[item], p2[item]);
}else{
/**自定义配置项覆盖默认配置**/
if((typeof p1)!='undefined' && (typeof p1[item])!='undefined' && p1[item]){
p[item] = p1[item];
}else{
p[item] = p2[item];
}
}
}
return p;
})(p1,p2);
return p;s
}; //创建xhr
/**支持XHR对象和ActiveX对象**/
MyXhr.prototype.createXhr = function(){
if(typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject != "undefined"){
if(typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"];
var i, len;
for(i = o,len=versions.length; i<len; i++){
try{
new ActiveXObject(version[i]);
arguments.callee.activeXString = version[i];
break;
}catch(ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("NO XHR object available");
}
} //处理url
MyXhr.prototype.dealUrl = function(url){
var index = url.indexOf('?');
if(index == -1){
return url;
}
var domain = url.substring(0, index);
var pars = url.slice(index+1);
var arrs = pars.split('&');
var newurl = domain;
for(var item in arrs){
var arr = arrs[item].split("=");
var split = "&";
if(item == 0){
split = "?";
}
newurl += (split + encodeURIComponent(arr[0]) + "=" + encodeURIComponent(arr[1]));
}
return newurl; }

使用方法:

var xhr = new MyXhr({
"options":{
"method":"post",
"url":"http://example.com/searchGoods"
},
"success":function(data){
console.log(data);
},
"error":function(){
console.log('error');
}
});

js封装xhr【重复造轮子】的更多相关文章

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. 第27篇 重复造轮子---模拟IIS服务器

    在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...

  3. 重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关

    重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关 引言 重复造轮子系列是自己平时的一些总结.有的轮子依赖社区提供的轮子为基础,这里把使用过程的一些觉得有意思的做个分享.有些思路或者方法在 ...

  4. 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印

    重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...

  5. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  6. 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...

  7. Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写(全部用POSIX C实现)

    Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写实现了日志.原子操作.哈希字典.红黑树.动态库加载.线程.锁操作.配置文件.os适配层.事件驱动.工作队列.RPC.IPC ...

  8. Meteva——让预报检验不再重复造轮子

    更多精彩,请点击上方蓝字关注我们! 检验是什么?****预报准确率的客观表达 说到天气预报,你最先会想到什么? 早上听了预报,带了一天伞却没下一滴雨的调侃? 还是 "蓝天白云晴空万里突然暴风 ...

  9. 答应我,用了这个jupyter插件,别再重复造轮子了

    1 简介 在使用Python.R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题: p ...

  10. 54 个官方 Spring Boot Starters 出炉!别再重复造轮子了…….

    在之前的文章,栈长介绍了 Spring Boot Starters,不清楚的可以点击链接进去看下. 前段时间 Spring Boot 2.4.0 也发布了,本文栈长再详细总结下最新的 Spring B ...

随机推荐

  1. HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. u-boot简单学习笔记(二)——AR9331 uboot.lds分析

    最开始系统上电后 从uboot.lds开始引导 OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", ...

  3. openwrt gstreamer实例学习笔记(五. gstreamer BUS)

    1)概述 BUS(总线) 是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中.总线的优势是:当使用GStreamer的时候,应用程序不需要线程识别,即便GStreamer ...

  4. linux安装jdk tomcat nginx 以及常用命令

    linux: 操作系统,应用服务器上 常用命令: cd 切换命令 cd / cd ~ cd ../../ cd xx ll 展示所有的文件 ll -h 友好的展示 mkdir 创建目录 mkdir 目 ...

  5. 小程序多级下拉菜单demo

    小程序多级下拉菜单demo - CSDN博客 https://blog.csdn.net/github_39371177/article/details/80251211

  6. Window XP安装Ubuntu14.04实现Samba文件共享

    安装了Ubuntu14.04之后,在虚拟机设置里设置了文件共享.但在mnt文件夹下没有hgfs这个文件夹.依照网上说的去做还是不行,仅仅好放弃.改用samba实现Windows与Ubuntu文件共享. ...

  7. IDEA中Git的应用场景

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程git仓库上获取项目源码 场景三:小 ...

  8. luogu3373 【模板】线段树2

    题目大意: 已知一个数列,你需要进行下面三种操作:1.将某区间每一个数乘上x2.将某区间每一个数加上x3.求出某区间每一个数的和 本线段树的标记是个二元组:add和mul,其代表将一个线段中的每一个点 ...

  9. springboot如何使用外部tomcat容器

    一般情况spring-boot-starter-web是自带tomcat(即springboot内嵌tomcat),所以打包直接生成jar包,用java -jar命令就可以启动. 但,有时我们希望用w ...

  10. 跳转到AppStore 的不同位置办法

    程序跳转到appstore中指定的应用 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                    ...