浅析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 相关文章推荐
菜单效果
Oct 14 Javascript
Javascript 通过json自动生成Dom的代码
Apr 01 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
Dec 04 Javascript
js控制浏览器全屏示例代码
Feb 20 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
angular将html代码输出为内容的实例
Sep 30 Javascript
使用Vue 实现滑动验证码功能
Jun 27 Javascript
js实现简易计算器小功能
Nov 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
php checkbox 取值详细说明
2010/08/19 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
js加强的经典分页实例
2013/03/15 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
Java工程师面试集锦之Spring框架
2013/06/16 面试题
食堂员工工作职责
2013/12/18 职场文书
销售心得体会
2014/01/02 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
学校周年庆活动方案
2014/08/22 职场文书
给老婆的检讨书
2015/01/27 职场文书
党员身份证明材料
2015/06/19 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
MySQL的存储过程和相关函数
2022/04/26 MySQL