使用原生 的JS封装 Ajax,实现 仿JQuery的Ajax,post,get三种异步请求方式:

var MAjax = {
//根据浏览器创建异步对象
createXhr: function () {
//经测试:IE7.0及以上版本的IE,两种异步创建的两种方式都支持
//如果XMLHttpRequest存在,则是IE7.0及其它内核,则直接创建异步对象(!==非全等于, === 全等于)
if (typeof XMLHttpRequest !== 'undefined') { //相当!(typeof XMLHttpRequest === 'undefined')
return new XMLHttpRequest();
}
//如果ActiveObject存在,是IE7.0或以下IE内核,判断其版本,并创建相应的异步对象
else if (typeof ActiveXObject !== 'undefined') {
//如果ActiveObject对象的参数类型不是string类型,则判断ie版本并创建异步对象
var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];
for (var i = 0, len = versions.length; i < len; i++) {
try {
//在此创建出错的话,就跳到catch中,否则执行下一句,返回创建成功的对象
var xhr = new ActiveXObject(versions[i]);
//给当前窗体对象添加一个属性用于判断 是否创建成功了
this.IsCreateOk = versions[i];
return xhr;
}
catch (e) { }
}
if (typeof this.IsCreateOk === 'undefined') {
alert("您的浏览器版本过低,无法创建异步对象,请升级您的浏览器!");
}
} }, //将请求参数编码后拼接成url参数:例 name=aa&age=11 传入参数:{name:aa,age:11}
encodeData: function (paramters) {
var data = [];
for (var name in paramters) {
//将数组中的数据以=拼接后再添加到data数组中 [name=aa,age=11]
var _regesp = /%20/g; //空格的正则表达式
var _value = paramters[name].toString(); //获取值
data.push(encodeURIComponent(name).replace(_regesp, '+') + "=" + encodeURIComponent(_value).replace(_regesp, '+'));
}
//以&将数组元素拼接后返回 如:name=aa&age=11
return data.join("&");
}, //根据响应头类型,获取相对应类型的数据
responseData: function (request) {
var responseType = request.getResponseHeader("Content-Type");
switch (responseType) {
case 'text/xml':
return request.responseXML;
case 'text/json':
case 'text/javascript':
case 'application/javascript':
case 'application/x-javascript':
return eval('(' + request.responseText + ')');
default:
return request.responseText;
}
}, //ajax请求
ajax: function (options) {
//method, url, data, success,failure, asyn
var fn = function () { };
options.method = options.method.toUpperCase();
options.url = options.url;
options.data = this.encodeData(options.data);
options.success = options.success || fn();
options.failure = options.failure || fn();
options.asyn = typeof (options.asyn) == 'undefined' ? true : options.asyn; var xhr = this.createXhr(); //注册回调函数(每当异步请求状态0-4改变的时候,就调用此函数)【一定要在Open之前注册】
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {//判断 请求是否完成,响应是否就绪
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 300) {//判断返回的响应状态码
options.success(MSF.responseData(xhr), xhr.statusText);
} else {
options.failure(xhr.status, xhr.statusText);
}
}
} //判断请求类型,并发送请求和请求参数
switch (options.method) {
case 'POST':
xhr.open(options.method, options.url, options.asyn);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); //【在send之前设置请求头】
xhr.send(options.data);
break;
default:
options.url = options.url + '?' + options.data + '&d=' + Math.random(0, 99); //get请求,给url添加参数
xhr.open(options.method, options.url, options.asyn);
xhr.send(null);
break;
}
}, //get请求
get: function (url, data, callback) {
var fn = function () { };
callback = callback || fn();
this.url = url + '?' + this.encodeData(data) + '&d=' + Math.random(0, 99); //创建异步对象
var xhr = this.createXhr(); //注册回调函数(每当异步请求状态0-4改变的时候,就调用此函数)【一定要在Open之前注册】
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {//判断 请求是否完成,响应是否就绪
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 300) {//判断返回的响应状态码
callback(MSF.responseData(xhr), xhr.statusText);
} else {
callback(xhr.status, xhr.statusText);
}
}
} //开始异步
xhr.open('GET', this.url, true);
xhr.send(null);
}, //post请求
post: function (url, data, callback) {
this.url = url + "?d=" + Math.random(0, 99);
callback = callback || function () { };
this.data = this.encodeData(data); var xhr = this.createXhr(); xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {//判断 请求是否完成,响应是否就绪
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 300) {//判断返回的响应状态码
callback(MSF.responseData(xhr), xhr.statusText);
} else {
callback(xhr.status, xhr.statusText);
}
}
} xhr.open("POST", this.url, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(this.data);
}
};

使用实例:

//调用:
MAjax.ajax({
method: "get",
url: "GetPaht_Test.aspx",
data: { "name": "jack", "age": 15 },
success: function (data,state) { alert(data+"----"+state); },
failure: function () { alert("请求失败了") }
}); MAjax.get(
"GetPaht_Test.aspx",
{ "name": "jack", "age": 15 },
function (data, state) { alert(data + "----" + state) }
); MAjax.post(
"GetPaht_Test.aspx",
{ "name": "jack", "age": 15 },
function (data, state) { alert(data + "----" + state) }
);

使用原生JS封装Ajax的更多相关文章

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

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  2. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  3. 原生JS封装ajax方法

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

  4. 原生js封装ajax,深入理解$.ajax()

    直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...

  5. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  6. ajax 原生js封装ajax [转]

    /* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @ ...

  7. 原生JS封装ajax以及request

    一.封装原生的xhr为ajax类 xhr以及用法见之前的文章 1.根据url确定请求的头部以及别的信息. var _headerConfig = {}; if(url.indexOf('getcapt ...

  8. 原生js封装ajax,实现跨域请求

    描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...

  9. 原生js封装Ajax

    [转载请注明出处] 1 /** * @fileoverview ajax请求公用组件 * @author Limo * @date 2015/08/07 * Native package ajax m ...

随机推荐

  1. 动态库在线更新导致coredump的问题

    最近我们数据中心主机上的第三方管理工具升级,导致数据中心系统coredump,看起来不相关的事情,到底是怎么回事了? 首先,打开core文件看看: core.45259 is truncated: e ...

  2. 关于The serializable class XXX does not declare a static final serialVersionUID field of type long的警告

    编写实体类并且继承序列化接口时候,实体类会有警告,要生成一个静态的serialVersionUID. 上网搜了一下资料,现通俗解释一下: 点击前2个选项,会生成: private static fin ...

  3. [EmguCV|WinForm] 使用EmguCV內建直方圖工具繪製直方圖(Histogram)-直方圖(Histogram)系列 (1)

    https://dotblogs.com.tw/v6610688/archive/2013/12/20/emgucv_draw_histogram_histogrambox_histogramview ...

  4. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  5. js013-事件

    js013-事件 本章内容 理解事件流 使用时间处理程序 不同的事件类型 JS与HTML之间的交互是通过实践实现的.时间就还文档或浏览器窗口发生的一些特定的交互 瞬间.可以使用侦听器来预定事件,以便时 ...

  6. DOCKER windows安装

    DOCKER windows安装 1.下载程序包 2. 设置环境变量 3. 启动DOCKERT 4. 分析start.sh 5. 利用SSH工具管理 6. 下载镜像 6.1 下载地址 6.2 用FTP ...

  7. Ios 消息推送

    手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html http://www.cnblogs.com/cdts_change ...

  8. 序列化与反序列化成XML

    http://blog.itpub.net/12639172/viewspace-490786/ 现在XML都普遍的用到了很多地方,它的平台无关.方便.结构化.适用性的特点让人不得不去接受它,在C#中 ...

  9. Request.GetOwinContext()打不到

    Although it's in the Microsoft.Owin.Host.SystemWeb assembly it is an extension method in the System. ...

  10. owin

    app.Properties["Hello"] = System.DateTime.Now; app.Run(async context => await context.R ...