在做项目的时候,有时候需要用到异步数据请求,但是如果这个时候没有框架的依赖,就需要用到原生JS进行异步数据请求。这时候无非有两种请求方式,一种是AJAX,另一个是JSONP。通过原生JS对异步请求进行简单的封装。

AJAX
AJAX是一种数据请求方式,不需要刷新整个页面就能够更新局部页面的数据。AJAX的技术核心是XMLHttpRequest对象,主要请求过程如下:
不说话直接贴代码
/**
* 通过JSON的方式请求
* @param {[type]} params [description]
* @return {[type]} [description]
*/
ajaxJSON(params) {
params.type = (params.type || 'GET').toUpperCase();
params.data = params.data || {};
var formatedParams = this.formateParams(params.data, params.cache);
var xhr;
//创建XMLHttpRequest对象
if (window.XMLHttpRequest) {
//非IE6
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//异步状态发生改变,接收响应数据
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
if (!!params.success) {
if (typeof xhr.responseText == 'string') {
params.success(JSON.parse(xhr.responseText));
} else {
params.success(xhr.responseText);
}
}
} else {
params.error && params.error(status);
}
}
if (params.type == 'GET') {
//连接服务器
xhr.open('GET', (!!formatedParams ? params.url + '?' + formatedParams : params.url), true);
//发送请求
xhr.send();
} else {
//连接服务器
xhr.open('POST', params.url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送请求
xhr.send(formatedParams);
}
},
/**
* 格式化数据
* @param {Obj} data 需要格式化的数据
* @param {Boolean} isCache 是否加入随机参数
* @return {String} 返回的字符串
*/
formateParams: function(data, isCache) {
var arr = [];
for (var name in data) {
arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}
if (isCache) {
arr.push('v=' + (new Date()).getTime());
}
return arr.join('&');
}
IE7及其以上版本中支持原生的 XHR 对象,因此可以直接用:var oAjax = new XMLHttpRequest();。IE6及其之前的版本中,XHR对象是通过MSXML库中的一个ActiveXObject对象实现的。
通过xhr的open函数来连接服务器,主要接收三个参数:请求方式、请求地址和是否异步请求(一般都是异步请求)。请求方式有两种,GET和POST,GET是通过URL将数据提交到服务器的,POST则是通过将数据作为send方法的参数发送到服务器。
给xhr绑定状态改变函数onreadystatechange,主要用来检测xhr的readyState的变化,当异步发送成功后,readyState的数值会由0变成4,同时触发onreadystatechange事件。readyState的属性及对应状态如下:
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化) 对象已建立,尚未调用send方法
2 (发送数据) send方法已调用,但是当前的状态及http头未知
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误
4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
在readystatechange事件中,先判断响应是否接收完成,然后判断服务器是否成功处理请求,xhr.status 是状态码,状态码以2开头的都是成功,304表示从缓存中获取,上面的代码在每次请求的时候都加入了随机数,所以不会从缓存中取值,故该状态不需判断。
JSONP
如果还是用上面的XMLHttpRequest对象来发送需要跨域的请求,虽然调用了send函数,但是xhr的状态一直都是0,也不会触发onreadystatechange事件,这个时候就要用到JSONP的请求方式了。
JSONP(JSON with Padding) 是一种跨域请求方式。主要原理是利用了script标签可以跨域请求的特点,由其src属性发送请求到服务器,服务器返回js代码,网页端接受响应,然后就直接执行了,这和通过script标签引用外部文件的原理是一样的。
JSONP由两部分组成:回调函数和数据,回调函数一般是由网页端控制,作为参数发往服务器端,服务器端把该函数和数据拼成字符串返回。
比如网页端创建一个script标签,并给其src赋值为http://www.test.com/json/?callback=process, 此时网页端就发起一个请求。服务端将要返回的数据拼作为函数的参数传入,服务端返回的数据格式类似”process({‘name:'xieyufei'})”,网页端接收到了响应值,因为请求者是 script,所以相当于直接调用process方法,并且传入了一个参数。
不说话直接贴代码。
/**
* 通过JSONP的方式请求
* @param {[type]} params [description]
* @return {[type]} [description]
*/
ajaxJSONP(params) {
params.data = params.data || {};
params.jsonp = params.jsonp || 'callback';
// 设置传递给后台的回调参数名和参数值
var callbackName = 'jsonp_' + (new Date()).getTime();
params.data[params.jsonp] = callbackName;
var formatedParams = this.formateParams(params.data, params.cache);
//创建script标签并插入到页面中
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
head.appendChild(script);
//创建jsonp回调函数
window[callbackName] = function(json) {
head.removeChild(script);
clearTimeout(script.timer);
window[callbackName] = null;
params.success && params.success(json);
};
//发送请求
script.src = (!!formatedParams ? params.url + '?' + formatedParams : params.url);
//为了得知此次请求是否成功,设置超时处理
if (params.time) {
script.timer = setTimeout(function() {
window[callbackName] = null;
head.removeChild(script);
params.error && params.error({
message: '超时'
});
}, params.time);
}
}
给script标签设置src属性时浏览器就会去发送请求,但是只能发送一次请求,导致script标签不能复用,因此每次操作完都需要把script标签移除。在浏览器发送请求之前给全局绑定一个回调函数,当数据请求成功时就会调用这个回调函数。
总结
将两种发送异步数据的方式整合起来,根据dataType来进行判断选用哪种方式。贴上完整的代码
var xyfAjax = {
ajax: function(params) {
params = params || {};
params.cache = params.cache || false;
if (!params.url) {
throw new Error('参数不合法');
}
params.dataType = (params.dataType || 'json').toLowerCase();
if (params.dataType == 'jsonp') {
this.ajaxJSONP(params);
} else if (params.dataType == 'json') {
this.ajaxJSON(params);
}
},
/**
* 通过JSONP的方式请求
* @param {[type]} params [description]
* @return {[type]} [description]
*/
ajaxJSONP(params) {
params.data = params.data || {};
params.jsonp = params.jsonp || 'callback';
// 设置传递给后台的回调参数名和参数值
var callbackName = 'jsonp_' + (new Date()).getTime();
params.data[params.jsonp] = callbackName;
var formatedParams = this.formateParams(params.data, params.cache);
//创建script标签并插入到页面中
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
head.appendChild(script);
//创建jsonp回调函数
window[callbackName] = function(json) {
head.removeChild(script);
clearTimeout(script.timer);
window[callbackName] = null;
params.success && params.success(json);
};
//发送请求
script.src = (!!formatedParams ? params.url + '?' + formatedParams : params.url);
//为了得知此次请求是否成功,设置超时处理
if (params.time) {
script.timer = setTimeout(function() {
window[callbackName] = null;
head.removeChild(script);
params.error && params.error({
message: '超时'
});
}, params.time);
}
},
/**
* 通过JSON的方式请求
* @param {[type]} params [description]
* @return {[type]} [description]
*/
ajaxJSON(params) {
params.type = (params.type || 'GET').toUpperCase();
params.data = params.data || {};
var formatedParams = this.formateParams(params.data, params.cache);
var xhr;
//创建XMLHttpRequest对象
if (window.XMLHttpRequest) {
//非IE6
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//异步状态发生改变,接收响应数据
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
if (!!params.success) {
if (typeof xhr.responseText == 'string') {
params.success(JSON.parse(xhr.responseText));
} else {
params.success(xhr.responseText);
}
}
} else {
params.error && params.error(status);
}
}
if (params.type == 'GET') {
//连接服务器
xhr.open('GET', (!!formatedParams ? params.url + '?' + formatedParams : params.url), true);
//发送请求
xhr.send(null);
} else {
//连接服务器
xhr.open('POST', params.url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送请求
xhr.send(formatedParams);
}
},
/**
* 格式化数据
* @param {Obj} data 需要格式化的数据
* @param {Boolean} isCache 是否加入随机参数
* @return {String} 返回的字符串
*/
formateParams: function(data, isCache) {
var arr = [];
for (var name in data) {
arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}
if (isCache) {
arr.push('v=' + (new Date()).getTime());
}
return arr.join('&');
}
}
xyfAjax.ajax({
url:'http://www.xieyufei.com',
type:'get', //or post
dataType:'json', //or jsonp
data:{
name:'xyf'
},
success: function(data){
console.log(data)
}
})
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js发送异步数据请求
# js异步数据请求
# js发送异步数据
# Node.js模拟发起http请求从异步转同步的5种用法
# 原生JavaScript实现Ajax异步请求
# JavaScript利用fetch实现异步请求的方法实例
# 详解Vuejs2.0之异步跨域请求
# SpringMVC环境下实现的Ajax异步请求JSON格式数据
# angularjs 处理多个异步请求方法汇总
# jquery的ajax异步请求接收返回json数据实例
# JS多个异步请求 按顺序执行next实现解析
# 回调
# 都是
# 是一种
# 这个时候
# 有两种
# 不说话
# 绑定
# 服务端
# 随机数
# 不需要
# 是由
# 则是
# 两种
# 可以通过
# 可以直接
# 时就
# 发送到
# 不需
# 会去
# 哪种
相关文章:
重庆网站制作公司哪家好,重庆中考招生办官方网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
音响网站制作视频教程,隆霸音响官方网站?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
微课制作网站有哪些,微课网怎么进?
如何通过远程VPS快速搭建个人网站?
教学网站制作软件,学习*后期制作的网站有哪些?
建站之星展会模板:智能建站与自助搭建高效解决方案
浅谈Javascript中的Label语句
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何快速完成中国万网建站详细流程?
行程制作网站有哪些,第三方机票电子行程单怎么开?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
北京网站制作网页,网站升级改版需要多久?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何用狗爹虚拟主机快速搭建网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何在万网开始建站?分步指南解析
如何快速搭建高效WAP手机网站吸引移动用户?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
,如何利用word制作宣传手册?
简单实现Android验证码
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
建站VPS推荐:2025年高性能服务器配置指南
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何选择适配移动端的WAP自助建站平台?
建站VPS配置与SEO优化指南:关键词排名提升策略
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Swift中swift中的switch 语句
网站制作软件免费下载安装,有哪些免费下载的软件网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何用已有域名快速搭建网站?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
网站代码制作软件有哪些,如何生成自己网站的代码?
怎么将XML数据可视化 D3.js加载XML
家庭建站与云服务器建站,如何选择更优?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在宝塔面板创建新站点?
c# 在ASP.NET Core中管理和取消后台任务
定制建站是什么?如何实现个性化需求?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星24小时客服电话如何获取?
建站主机选哪家性价比最高?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
*请认真填写需求信息,我们会在24小时内与您取得联系。