浅析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 相关文章推荐
求得div 下 img的src地址的js代码
Feb 28 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
Aug 02 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
Jan 24 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
jquery简单实现外部链接用新窗口打开的方法
May 30 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
javascript+jQuery实现360开机时间显示效果
Nov 03 jQuery
微信小程序使用input组件实现密码框功能【附源码下载】
Dec 11 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 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.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
解决Python传递中文参数的问题
2015/08/04 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
python常用排序算法的实现代码
2019/11/08 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
心理学专业毕业生推荐信范文
2013/11/21 职场文书
中学教师师德承诺书
2014/05/23 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
课程设计感想范文
2015/08/11 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Python入门之基础语法详解
2021/05/11 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server