浅析JSONP技术原理及实现


Posted in Javascript onJune 08, 2016

跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONP

JSONP在我的理解,它并不是ajax,它是在文档中插入一个script标签,创建_callback方法,通过服务器配合执行_callback方法,并传入一些参数

JSONP的局限就在于,因为是通过插入script标签,所以参数只能通过url传入,因此只能满足get请求,特别jQuery的ajax方法时,即使设置type: 'POST',但是只要设置了dataType: 'jsonp',在请求时,都会自动使用GET请求

实现逻辑

step1: 创建_callback方法 (_callback中可以删除script标签和_callback方法)

step2: 插入script标签

step3: 服务器输出js

实现:

var requestJsonp = function (opt) {
var funName, script;
/*
* step1 创建_callback方法
*/ 
//_callback函数名
funName = '_cb' + (Math.random() * 1000000);
//创建_callback方法
window[funName] = function (data) {
if (typeof opt.success == 'function') {
opt.success(data);
}
window[funName] = null;
delete window[funName];
document.body.removeChild(script);
script = null;
};
/*
* step2 插入script标签
*/
script = document.createElement('script');
script.type = 'text/javascript';
script.src = opt.url + (opt.url.indexOf('?') > -1 ? '&' : '?') + '_callback=' + funName;
document.body.appendChild(script);
/*
* step3 服务器输出js
* 服务器应接受url参数中_callback的值,作为函数名执行输出js
* 类似输出
* _callback({"name":"jsonp","description":"jsonp test"});
*/ 
/*
* 处理error
*/
script.addEventListener('error', function () {
window[funName] = null;
delete window[funName];
if (typeof opt.error == 'function') {
opt.error();
}
document.body.removeChild(script);
script = null;
});
};
requestJsonp({
url: 'http://www.url.org?tid=Jsx2',
success: function (data) {
console.log(data);
},
error: function () {
console.log('request error!');
}
});

对于浏览器的行为就是插入script标签,执行js代码, 删除script标签

实现代码并没有考虑兼容以及传入data后生成url的问题。

下面给大家说下jsonp的优缺点:

JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

以上所述是小编给大家介绍的浅析JSONP技术原理及实现的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript &&和||运算法的另类使用技巧
Nov 28 Javascript
zShowBox 图片放大展示jquery版 兼容性
Sep 24 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 Javascript
jQuery动画与特效详解
Feb 01 Javascript
微信小程序-拍照或选择图片并上传文件
Jan 06 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
C#微信小程序服务端获取用户解密信息实例代码
Mar 10 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
Dec 26 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
JSONP原理及简单实现
Jun 08 #Javascript
Javascript必知必会(四)js类型转换
Jun 08 #Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 #Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 #Javascript
JavaScript必知必会(九)function 说起 闭包问题
Jun 08 #Javascript
jQuery+ajax+asp.net获取Json值的方法
Jun 08 #Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 #Javascript
You might like
php mssql 时间格式问题
2009/01/13 PHP
PHP Document 代码注释规范
2009/04/13 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
Oracle性能调优原则
2012/05/03 面试题
.NET方向面试题
2014/11/20 面试题
企业总经理职责
2014/02/02 职场文书
品酒会策划方案
2014/05/26 职场文书
假释思想汇报范文
2014/10/11 职场文书
工作简历自我评价
2015/03/11 职场文书
喋血孤城观后感
2015/06/08 职场文书
山楂树之恋观后感
2015/06/11 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书