浅析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 相关文章推荐
些很实用且必用的小脚本代码
Jun 26 Javascript
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
node.js中的path.resolve方法使用说明
Dec 08 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 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 fsockopen写的HTTP下载的类
2007/02/22 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
vue常用指令代码实例总结
2020/03/16 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
企业趣味活动方案
2014/08/21 职场文书
借款协议书
2014/09/16 职场文书
社区节水倡议书
2015/04/29 职场文书