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 ...
随机推荐
- [PHP]PDO调用存储过程
1. 数据库中已创建存储过程user_logon_check, PHP调用示例如下, <?php $dsn = 'mssql:dbname=MyDbName;host=localhost'; $ ...
- 三分钟教你学Git(十四) 之 线下传输仓库
有时候还有一个人不能从远程直接clone仓库或者说由于非常大,clone非常慢或其他原因.我们能够使用bundle命令将Git仓库打包,然后通过U盘或者是其他介质拷贝给他,这样他拿到打包好的仓库后能够 ...
- Xamarin.Android 记事本(一)
导读 1.视图及数据库的创建 2.listview数据绑定 3.listview的点击事件 正文 如何创建一个listview,大家可以看这里,基本流程操作是一模一样的,我就不多说了,然后就是新建一个 ...
- PR修改例子
DATA: lt_items_old LIKE TABLE OF bapiebanv WITH HEADER LINE. DATA: lt_items_new LIKE TABLE ...
- POJ3273 Monthly Expense —— 二分
题目链接:http://poj.org/problem?id=3273 Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Tota ...
- hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题目意思:有 资金 n 和 m 种类型的大米,对第 i 种类型的大米,价格.数量.袋数分别是: ...
- codeforces B. Sereja and Mirroring 解题报告
题目链接:http://codeforces.com/contest/426/problem/B 题目意思:给出一个n * m的矩阵a,需要找出一个最小的矩阵b,它能通过several次的mirror ...
- Echarts饼状图
<head> <meta charset="utf-8"> <title>ECharts</title> <script sr ...
- Tomcat的一些问题
首先设置好TOMCAT环境变量(如何设置?) 1.用Servlet发现每次改动Servlet都要重启Tomcat才能生效!!!搞死爹了!! 可以选择shutdown命令或者直接叉掉汤姆猫窗口!!!然后 ...
- Spring配置错误 No adapter for IAdvice of type
参考:http://www.2cto.com/kf/201305/211728.html 错误十三 在配置拦截器后,运行的时候报错=> Error creating context 'sprin ...