浅析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选择器(常用选择器说明)
Sep 28 Javascript
jQuery之折叠面板的深入解析
Jun 19 Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
Nov 08 Javascript
node.js cookie-parser之parser.js
Jun 06 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
JS实现的字符串数组去重功能小结
Jun 17 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 Javascript
vue+openlayers绘制省市边界线
Dec 24 Vue.js
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
Terran兵种介绍
2020/03/14 星际争霸
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
django 信号调度机制详解
2019/07/19 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
工程造价管理专业大专生求职信
2013/10/06 职场文书
三年级音乐教学反思
2014/01/28 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
介绍信的格式
2015/01/30 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
校园运动会广播稿
2015/08/19 职场文书
《法国号》教学反思
2016/02/22 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
Python学习开发之图形用户界面详解
2021/08/23 Python
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android