浅析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函数的重载
Sep 22 Javascript
JavaScript中的History历史对象
Jan 16 Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
基于js实现判断浏览器类型代码实例
Jul 17 Javascript
VUE使用draggable实现组件拖拽
Apr 06 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
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php 获取全局变量的代码
2011/04/21 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php 类自动载入的方法
2015/06/03 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
jQuery 选择器详解
2015/01/19 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
详解jQuery事件
2017/01/13 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python利用正则表达式提取字符串
2016/12/08 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
Python调用Windows命令打印文件
2020/02/07 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
工厂搬迁方案
2014/05/11 职场文书
庆元旦活动总结
2014/07/09 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
安全保证书格式
2015/02/28 职场文书
药店收银员岗位职责
2015/04/07 职场文书
放假通知
2015/04/14 职场文书
结婚仪式主持词
2015/06/29 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
浅谈python数据类型及其操作
2021/05/25 Python