js封装xhr【重复造轮子】
仿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【重复造轮子】的更多相关文章
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- 第27篇 重复造轮子---模拟IIS服务器
在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...
- 重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关
重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关 引言 重复造轮子系列是自己平时的一些总结.有的轮子依赖社区提供的轮子为基础,这里把使用过程的一些觉得有意思的做个分享.有些思路或者方法在 ...
- 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印
重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...
- GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。
1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...
- 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)
一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...
- Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写(全部用POSIX C实现)
Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写实现了日志.原子操作.哈希字典.红黑树.动态库加载.线程.锁操作.配置文件.os适配层.事件驱动.工作队列.RPC.IPC ...
- Meteva——让预报检验不再重复造轮子
更多精彩,请点击上方蓝字关注我们! 检验是什么?****预报准确率的客观表达 说到天气预报,你最先会想到什么? 早上听了预报,带了一天伞却没下一滴雨的调侃? 还是 "蓝天白云晴空万里突然暴风 ...
- 答应我,用了这个jupyter插件,别再重复造轮子了
1 简介 在使用Python.R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题: p ...
- 54 个官方 Spring Boot Starters 出炉!别再重复造轮子了…….
在之前的文章,栈长介绍了 Spring Boot Starters,不清楚的可以点击链接进去看下. 前段时间 Spring Boot 2.4.0 也发布了,本文栈长再详细总结下最新的 Spring B ...
随机推荐
- MD5介绍及Windows下对文件做md5校验。
MD5介绍参考百度百科: 摘要如下: MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性. 一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度 ...
- C++类使用static小例子(新手学习C++)
//为什么类的成员中不能包括动态分配的数据,若包含静态数据怎么使用?#include <iostream>using namespace std;class point{ priva ...
- android keyEvent
http://developer.android.com/reference/android/view/KeyEvent.html
- Windows 8实用窍门系列:20.Windows 8中的GridView使用(二)和DataTemplateSelector
在本文中所讲述内容的实例仍然沿用于上篇文章,有什么疑惑可以参考上篇文章. 一 GroupStyle 在GridView控件中我们可以对数据进行分组显示,通过对GridView的GroupStyle进行 ...
- Axure Base 01
名词解释: 线框图:一般就是指产品原型,比如:把线框图尽快画出来和把原型尽快做出来是一个意思. axure元件:也叫axure组件或axure部件,系统自带了一部分最基础常用的,网上也有很多别人做好的 ...
- 在Android Studio中移除导入的模块依赖
进入settings.gradle(Project Settings) include ':app', ':pull_down_list_view' 要移除的Module dependency为“pu ...
- HDU 2746 Cyclic Nacklace
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- linux下lk和kernel层通信方式[2]
U-Boot与Linux内核的交互 说明:本文所使用的U-Boot的版本是1.1.6,平台是S3C2440. 目录 一.简介 1.1标记列表二.设置标记存放的地址 2.1相关的结构体定义 2.2标记存 ...
- HDU3667 Transportation —— 最小费用流(费用与流量平方成正比)
题目链接:https://vjudge.net/problem/HDU-3667 Transportation Time Limit: 2000/1000 MS (Java/Others) Me ...
- LightOJ - 1422 Halloween Costumes —— 区间DP
题目链接:https://vjudge.net/problem/LightOJ-1422 1422 - Halloween Costumes PDF (English) Statistics F ...