浅析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实现读取txt文档的脚本
Jul 20 Javascript
js 日期转换成中文格式的函数
Jul 07 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
Aug 08 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
Vue如何引入远程JS文件
Apr 20 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
Vue使用轮询定时发送请求代码
Aug 10 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
我的群发邮件程序
2006/10/09 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
jquery 问答知识整理
2010/02/11 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
domReady的实现案例
2016/11/23 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
python看某个模块的版本方法
2018/10/16 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
DBA的职责都有哪些
2012/05/16 面试题
环保倡议书300字
2014/05/15 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
python随机打印成绩排名表
2021/06/23 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js