浅析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 相关文章推荐
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
Feb 03 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
javascript实现禁止鼠标滚轮事件
Jul 24 Javascript
详解JavaScript中|单竖杠运算符的使用方法
May 23 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
详解使用nvm管理多版本node的方法
Aug 30 Javascript
基于js中style.width与offsetWidth的区别(详解)
Nov 12 Javascript
JS控制GIF图片的停止与显示
Oct 24 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
在nuxt中使用路由重定向的实例
Nov 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
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
JS验证字符串功能
2017/02/22 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
python使用Geany编辑器配置方法
2020/02/21 Python
详解python tkinter 图片插入问题
2020/09/03 Python
求职自荐信范文格式
2013/11/29 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers