1             /*
* ajax方法
*/
var Ajax = function() {
var that = this;
//创建异步请求对象方法
that.createXHR = function() {
if(window.XMLHttpRequest) { //IE7+、Firefox、Opera、Chrome 和Safari
return new XMLHttpRequest();
} else if(window.ActiveXObject) { //IE6 及以下
var versions = ['MSXML2.XMLHttp', 'Microsoft.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; i++) {
try {
return new ActiveXObject(version[i]);
break;
} catch(e) {
//跳过
}
}
} else {
throw new Error('浏览器不支持XHR对象!');
}
}
//初始化数据方法
that.init = function(obj) {
//初始化数据
var objAdapter = {
method: 'get',
data: {},
success: function() {},
complete: function() {},
error: function(s) {
alert('status:' + s + 'error!');
},
async: true
}
//通过使用JS随机字符串解决IE浏览器第二次默认获取缓存的问题
that.url = obj.url + '?rand=' + Math.random();
that.method = obj.method || objAdapter.method;
that.data = that.params(obj.data) || that.params(objAdapter.data);
that.async = obj.async || objAdapter.async;
that.complete = obj.complete || objAdapter.complete;
that.success = obj.success || objAdapter.success;
that.error = obj.error || objAdapter.error;
}
//ajax异步调用
that.ajax = function(obj) {
that.method = obj.method || 'get';
if(obj.method === 'post'){
that.post(obj);
}else{
that.get(obj);
}
}
//post方法
that.post = function(obj) {
var xhr = that.createXHR(); //创建XHR对象
that.init(obj);
that.method='post';
if(that.async === true) { //true表示异步,false表示同步
//使用异步调用的时候,需要触发readystatechange 事件
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) { //判断对象的状态是否交互完成
that.callback(obj,this); //回调
}
};
}
//在使用XHR对象时,必须先调用open()方法,
//它接受三个参数:请求类型(get、post)、请求的URL和表示是否异步。
xhr.open(that.method, that.url, that.async);
//post方式需要自己设置http的请求头,来模仿表单提交。
//放在open方法之后,send方法之前。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(that.data); //post方式将数据放在send()方法里
if(that.async === false) { //同步
that.callback(obj,this); //回调
}
};
//get方法
that.get = function(obj) {
var xhr = that.createXHR(); //创建XHR对象
that.init(obj);
if(that.async === true) { //true表示异步,false表示同步
//使用异步调用的时候,需要触发readystatechange 事件
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) { //判断对象的状态是否交互完成
that.callback(obj,this); //回调
}
};
}
//若是GET请求,则将数据加到url后面
that.url += that.url.indexOf('?') == -1 ? '?' + that.data : '&' + that.data;
//在使用XHR对象时,必须先调用open()方法,
//它接受三个参数:请求类型(get、post)、请求的URL和表示是否异步。
xhr.open(that.method, that.url, that.async);
xhr.send(null); //get方式则填null
if(that.async === false) { //同步
that.callback(obj,this); //回调
}
}
//请求成功后,回调方法
that.callback = function(obj,xhr) {
if(xhr.status == 200) { //判断http的交互是否成功,200表示成功
obj.success(xhr.responseText); //回调传递参数
} else {
alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText);
}
}
//数据转换
that.params = function(data) {
var arr = [];
for(var i in data) {
//特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理
arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
}
return arr.join('&');
}
return {
post : that.post,
get : that.get,
ajax : that.ajax
}
}

上述的Ajax方法可以看成是一个类,共有方法有:

1. 初始化数据方法init(),

2. 创建异步请求对象方法createXHR(),

3.请求方法ajax(),post(),get(),

4.请求成功后回调方法callback(),

5.数据格式转换方法params()

也可以看成一个函数,return 返回的json对象中定义的接口用于函数内方法的调用

故而有有两种方式进行使用封装的Ajax

函数方式:测试代码数据

             Ajax().post({
url: 'ajax.php',
data: {
'name': 'JR',
'age': 22
},
success: function(message) {
console.log(message);
},
async: true
});

类方式:测试代码数据

             var ajax = new Ajax();
ajax.post({
url: 'ajax.php',
data: {
'name': 'JR',
'age': 22
},
success: function(message) {
console.log(message);
},
async: true
});

对上述封装的ajax方法进行优化

var Ajax = {
//ajax模块
init: function(obj) {
//初始化数据
var objAdapter = {
url: '',
method: 'get',
data: {},
success: function() {},
complete: function() {},
error: function(s) {
alert('status:' + s + 'error!');
},
async: true
}
//通过使用JS随机字符串解决IE浏览器第二次默认获取缓存的问题
objAdapter.url = obj.url + '?rand=' + Math.random();
objAdapter.method = obj.method || objAdapter.method;
objAdapter.data = Ajax.params(obj.data) || Ajax.params(objAdapter.data);
objAdapter.async = obj.async || objAdapter.async;
objAdapter.complete = obj.complete || objAdapter.complete;
objAdapter.success = obj.success || objAdapter.success;
objAdapter.error = obj.error || objAdapter.error;
return objAdapter;
},
//创建XMLHttpRequest对象
createXHR: function() {
if(window.XMLHttpRequest) { //IE7+、Firefox、Opera、Chrome 和Safari
return new XMLHttpRequest();
} else if(window.ActiveXObject) { //IE6 及以下
var versions = ['MSXML2.XMLHttp', 'Microsoft.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; i++) {
try {
return new ActiveXObject(version[i]);
break;
} catch(e) {
//跳过
}
}
} else {
throw new Error('浏览器不支持XHR对象!');
}
},
params: function(data) {
var arr = [];
for(var i in data) {
//特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理
arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
}
return arr.join('&');
},
callback: function(obj, xhr) {
if(xhr.status == 200) { //判断http的交互是否成功,200表示成功
obj.success(xhr.responseText); //回调传递参数
} else {
alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText);
}
},
ajax: function(obj) {
if(obj.method === 'post') {
Ajax.post(obj);
} else {
Ajax.get(obj);
}
},
//post方法
post: function(obj) {
var xhr = Ajax.createXHR(); //创建XHR对象
var opt = Ajax.init(obj);
opt.method = 'post';
if(opt.async === true) { //true表示异步,false表示同步
//使用异步调用的时候,需要触发readystatechange 事件
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) { //判断对象的状态是否交互完成
Ajax.callback(opt, xhr); //回调
}
};
}
//在使用XHR对象时,必须先调用open()方法,
//它接受三个参数:请求类型(get、post)、请求的URL和表示是否异步。
xhr.open(opt.method, opt.url, opt.async);
//post方式需要自己设置http的请求头,来模仿表单提交。
//放在open方法之后,send方法之前。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(opt.data); //post方式将数据放在send()方法里
if(opt.async === false) { //同步
Ajax.callback(obj, xhr); //回调
}
},
//get方法
get: function(obj) {
var xhr = Ajax.createXHR(); //创建XHR对象
var opt = Ajax.init(obj);
if(opt.async === true) { //true表示异步,false表示同步
//使用异步调用的时候,需要触发readystatechange 事件
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) { //判断对象的状态是否交互完成
Ajax.callback(obj, xhr); //回调
}
};
}
//若是GET请求,则将数据加到url后面
opt.url += opt.url.indexOf('?') == -1 ? '?' + opt.data : '&' + opt.data;
//在使用XHR对象时,必须先调用open()方法,
//它接受三个参数:请求类型(get、post)、请求的URL和表示是否异步。
xhr.open(opt.method, opt.url, opt.async);
xhr.send(null); //get方式则填null
if(opt.async === false) { //同步
Ajax.callback(obj, xhr); //回调
}
}
};

测试代码

             Ajax.post({
url: 'ajax.php',
data: {
'name': 'JR',
'age': 22
},
success: function(message) {
console.log(message);
},
async: true
});

ajax.php页面代码

 <?php
echo $_POST['name'];
?>

控制台显示

javascript - 封装原生js实现ajax的更多相关文章

  1. 【转】封装原生JS实现Ajax

    function createXHR() { if (window.XMLHttpRequest) { //IE7+.Firefox.Opera.Chrome 和Safari return new X ...

  2. Ajax工作原理和原生JS的ajax封装

    前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...

  3. Ajax (Asynchronous javascript xml) 搜索框核心代码(JQuery) Ajax判断用户名存在核心代码 附:原生js的Ajax代码 其中有json的一句话解释

    前端 <script type="text/javascript"> $(function(){ $("#tid").keyup(function( ...

  4. 原生js实现ajax封装

    一.什么是ajax? 定义:Ajax(Asynchronous Java and XML的缩写)是一种异步请求数据的web开发技术,在不需要重新刷新页面的情况下,Ajax 通过异步请求加载后台数据,并 ...

  5. [javascript]原生js实现Ajax

    一.首先看JQuery提供的Ajax方法: $.ajax({ url: , type: '', dataType: '', data: { }, success: function(){ }, err ...

  6. 用原生JS实现AJAX和JSONP

    前端开发在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的.其实,原生 ...

  7. 原生js中用Ajax进行get传参

    原生js中用Ajax进行get传参 案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  8. 原生js实现ajax与jquery的ajax库,及json

    这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...

  9. 用原生js实现ajax、jsonp

    转载: http://www.cnblogs.com/yangheng/p/6065910.html 一.原生js实现ajax $.ajax({ url: '', type: 'post', data ...

随机推荐

  1. CSS3动画几个平时没注意的属性

    一.timing-function: steps() 一开始在使用CSS3的时候并没有太注意这个timing-function,只是注意到自定义贝塞尔曲线. 1)一个项目中的实例 先来看看左边加了st ...

  2. ZOJ Problem Set - 1350 The Drunk Jailer ac代码 memset

    这是一道很简单的题目,题目大概意思说下:就是有n个监狱(编号从1到n),第一次全部打开,第二次打开编号为2的倍数的,第三次打开编号为3的倍数的,以此类推...最后问你有几个监狱是打开的 题目中我使用了 ...

  3. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  4. LSM Tree存储组织结构介绍

    LSM Tree(Log Structured Merge Trees)数据组织方式被应用于多种数据库,如LevelDB.HBase.Cassandra等,下面我们从为什么使用LSM tree.LSM ...

  5. KVM的前世今生

    1.虚拟化技术的演变过程:软件模拟.虚拟化层翻译.容器虚拟化三个阶段 (1)软件模拟的技术方式 软件模拟是通过软件完全模拟CPU.网卡.芯片组.磁盘等计算机硬件,因为是软件模拟,所以理论上可以模拟任何 ...

  6. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  7. JSP自定义tag

    前端需要调用后端的配置,想起velocity-tools.然而jsp的话,目前只能想到tag和EL表达式了. Tag相当好写,jsp2.0提供了简化写法: 编写一个java类: public clas ...

  8. 如何设置 Panorama 控件的只读 SelectedIndex 属性?

    在 OnNavigatedTo() 方法中设置: panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

  9. c# 连接Mysql数据库

    mysql.data.dll下载_c#连接mysql必要插件 全部版本下载:http://hovertree.com/h/bjaf/0sft36s9.htm mysql.data.dll是C#操作MY ...

  10. Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)

    简介       ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...