浅析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 相关文章推荐
jQuery的Ajax的自动完成功能控件简要说明
Feb 22 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
jQuery实现的仿百度分页足迹效果代码
Oct 30 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
JS实现横向轮播图(中级版)
Jan 18 Javascript
微信小程序手动添加收货地址省市区联动
May 18 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python之list对应元素求和的方法
2018/06/28 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
Python tkinter实现日期选择器
2021/02/22 Python
百年校庆节目主持词
2014/03/27 职场文书
电子专业求职信
2014/06/19 职场文书
联片教研活动总结
2014/07/01 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
党支部季度考核意见
2015/06/02 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
Python socket如何解析HTTP请求内容
2022/02/12 Python