浅析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 相关文章推荐
用JS剩余字数计算的代码
Jul 03 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
Nov 25 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
详解Node.Js如何处理post数据
Sep 19 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
Oct 10 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
Feb 16 Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
Taro小程序自定义顶部导航栏功能的实现
Dec 17 Javascript
AngularJS实现多级下拉框
Mar 25 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音乐采集(部分代码)
2007/02/14 PHP
PHP调用Webservice实例代码
2011/07/29 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
python机器学习之神经网络(三)
2017/12/20 Python
python绘制多个曲线的折线图
2020/03/23 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
python实现用户名密码校验
2020/03/18 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
酒店员工职业生涯规划
2014/02/25 职场文书
2014年林业工作总结
2014/12/05 职场文书
先进典型事迹材料
2014/12/29 职场文书
六年级作文之预言作文
2019/10/25 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers