浅析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 相关文章推荐
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
Jan 06 Javascript
jQuery寻找n以内完全数的方法
Jun 24 Javascript
基于JavaScript实现类似于百度学术高级检索功能
Mar 02 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
生产制造追溯系统之在线打印功能
Jun 03 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 Javascript
详解小程序如何改变onLoad的执行时机
Nov 01 Javascript
vuex存储token示例
Nov 11 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
javascript实现页面的实时时钟显示示例
Aug 06 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内存缓存实现方法
2015/01/24 PHP
php中curl使用指南
2015/02/05 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
tensorflow 环境变量设置方式
2020/02/06 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
教师学习培训邀请函
2014/02/04 职场文书
校长寄语大全
2014/04/09 职场文书
阳光体育活动总结
2014/04/30 职场文书
MySQL约束超详解
2021/09/04 MySQL