基于ajax和jsonp的原生封装(实例)


Posted in Javascript onOctober 16, 2017

最近在学ajax和跨域,于是就自己封装了一个,虽然有点粗糙但还是可以用的。其实jsonp的本质就是:动态创建script标签,然后通过src属性发送跨域请求,然后服务器端响应的数据格式为【函数调用(foo(实参))】,所以在发送请求之前必须先声明一个函数,并且函数的名字与参数中传递的名字要一致。这里声明的函数是由服务器响应的内容(实际就是一段js代码-函数调用)来调用。

其他的就不多说了,直接上代码。

'use strict';
function ajax(obj){
var defaults = {
type:'get',
url:'#',
dataType:'text',
jsonp:'callback',
data:{},
async:true,
success:function(data){console.log(data);}
};
for(var k in obj){
defaults[k] = obj[k];
}
if(defaults.dataType == 'jsonp') {
//调用jsonp
ajaxForJsonp(defaults);
}
else {
//调用ajax json
ajaxForJson(defaults);
}
}

//json数据格式
function ajaxForJson(defaults){
//1、创建XMLHttpRequset对象
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}
else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var param = '';
for(var key in defaults.data) {
param += key + '='+ defaults.data[key] + '&';
}
if(param){
param = param.slice(0, param.length-1);
}
// 处理get请求参数并且处理中文乱码问题
if(defaults.type == 'get') {
defaults.url += '?' + encodeURI(param);
}
//2、准备发送(设置发送的参数)
xhr.open(defaults.type,defaults.url,defaults.async);
// 处理post请求参数并且设置请求头信息(必须设置)
var data = null;
if(defaults.type == 'post') {
data = param;
//设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
}
// 3、执行发送动作
xhr.send(data);
//处理同步请求,不会调用回调函数
if(!defaults.async) {
if(defaults.dataType == 'json'){
return JSON.parse(xhr.responseText);
}
else {
return xhr.responseText;
}
}
//// 4、指定回调函数(处理服务器响应数据)
xhr.onreadystatechange = function() {
if(xhr.readyState == 4){
if(xhr.status == 200){
var data = xhr.responseText;
if(defaults.dataType == 'json'){
data = JSON.parse(data);
}
defaults.success(data);
}
}
}
}

//跨域jsonp
function ajaxForJsonp(defaults){
//cbName默认的是回调函数名称
var cbName = 'jQuery' + ('1.12.2' + Math.random()).replace(/\D/g,'') + '_' + (new Date().getTime());
if(defaults.jsonpCallback) {
cbName = defaults.jsonpCallback;
}
//这里就是回调函数,调用方式:服务器响应内容来调用
//向window对象中添加一个方法,方法名是变量cname的值
window[cbName] = function(data) {
defaults.success(data);//这里success的data是实参
}
var param = '';
for(var key in defaults.data){
param += key + '=' + defaults.data[key] + '&'; 
}
if(param){
param = param.slice(0, param.length-1);
param = '&' + param;
}
var script = document.createElement('script');
script.src = defaults.url + '?' + defaults.jsonp + '=' + cbName + param;
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
}

以上这篇基于ajax和jsonp的原生封装(实例)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery ajax执行后台方法
Mar 18 Javascript
jquery trim() 功能源代码
Feb 14 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
JavaScript的jQuery库中function的存在和参数问题
Aug 13 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
jquery请求servlet实现ajax异步请求的示例
Jun 03 jQuery
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
使用jQuery动态设置单选框的选中效果
Dec 06 jQuery
vue cli4.0项目引入typescript的方法
Jul 17 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 Javascript
AngularJS实现注册表单验证功能
Oct 16 #Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
Oct 16 #Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 #Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 #Javascript
angular4中关于表单的校验示例
Oct 16 #Javascript
原生JS实现小小的音乐播放器
Oct 16 #Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 #jQuery
You might like
smarty获得当前url的方法分享
2014/02/14 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python3实现从指定路径查找文件的方法
2015/05/22 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
numpy中的高维数组转置实例
2018/04/17 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
django自带调试服务器的使用详解
2019/08/29 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Python 实现微信自动回复的方法
2020/09/11 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
函授本科自我鉴定
2013/11/03 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
村级四风对照检查材料
2014/08/24 职场文书
高中体育课教学反思
2016/02/16 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android