基于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 相关文章推荐
javascript基础知识大集锦(一) 推荐收藏
Jan 13 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
Apr 10 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
JS中字符串trim()使用示例
May 26 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
Node.js开启Https的实践详解
Oct 25 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
Js通过AES加密后PHP用Openssl解密的方法
Jul 12 Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 Javascript
在Vue项目中使用Typescript的实现
Dec 19 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
php小偷相关截取函数备忘
2010/11/28 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
Python中input和raw_input的一点区别
2014/10/21 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
Django nginx配置实现过程详解
2020/09/10 Python
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
2019年.net常见面试问题
2012/02/12 面试题
求职者应聘的自我评价
2013/10/16 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
陈欧的广告词
2014/03/18 职场文书
生产车间标语
2014/06/11 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
社会实践活动总结范文
2014/07/03 职场文书
关于学习的决心书
2015/02/05 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
php去除deprecated的实例方法
2021/11/17 PHP
redis缓存存储Session原理机制
2021/11/20 Redis