使用原生 的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. nginx日志分析

    日志格式 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $b ...

  2. Beta版本冲刺第三天 12.9

    一.站立式会议照片: 二.项目燃尽图: Android端 后台 三.项目进展: 成 员 上次完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成用户简历的填写和查看 日期合理性的判断 ...

  3. css3实现手机效果的“切换标签”

    Style样式 .toggle { position: relative; display: inline-block; width: 60px; height: 30px; border: 1px ...

  4. 高性能JavaScript(您值得一看)

    众所周知浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. ...

  5. UOJ#246. 【UER #7】套路

    题目传送门 官方题解传送门 一句话题意的话就是给定一个序列,从中找出至少$k$个连续的元素形成子序列,使得子序列中任意两个元素差值的最小值于其长度-1的乘积最大. 题目中给出了$ 1 \leq a_i ...

  6. UVA 11419SAM I AM(输出 最小覆盖点 )

    参考博客:如何找取 最小覆盖点集合 题意:R*C大小的网格,网格上面放了一些目标.可以再网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标,计算最小多少子弹,各从哪些位置发射 ...

  7. python 线程编程

    在threading模块中,定义两种类型的锁:threading.Lock和threading.RLock.它们之间有一点细微的区别,通过比较下面两段代码来说明: import threading l ...

  8. 关于主机FTP连接不上,无法列出目录,列表错误,上传速度慢,掉速的解决办法

    FTP是一种文件传输协议,它支持两种模式: 一种方式叫做Standard (也就是 Active,主动方式), 一种是 Passive (也就是PASV,被动方式). Standard模式 FTP的客 ...

  9. MySQL学习笔记——存储过程

  10. JSON FX

    https://github.com/mckamey/jsonfx-v1#svn/trunk/JsonFx/JsonFx.Json