借助script进行Http跨域请求:JSONP实现原理及代码


Posted in Javascript onMarch 19, 2013

<script>元素的src属性能设置URL并发起HTTP GET请求, 使用<script>元素实现脚本操作HTTP可以跨域通信而不受限与同源策略. 通常, 使用基于<script>的Ajax传输协议时, 服务器响应采用JSON编码的数据格式, 当执行脚本时候, JavaScript解析器能够自动将其解码. 由于它使用JSON数据格式, 因此这种Ajax传输协议也叫做"JSONP". 所以使用jsonp技术, 只需要设置<script>的src属性, 并且插入到document中, 然后浏览器就会发送一个http请求以下载src属性所执行的url.

当使用<script>元素调用数据时, 响应内容必须用JavaScript函数名和圆括号包裹起来(也就是只能作为函数的参数), 而不是直接的一段json数据:

response( 
[1, 2, {"hello", "world"}] 
)

为了可行期间, 我们必须通过某种方式告诉服务, 它正在从一个<script>元素调用, 必须返回一个jsonp响应, 而不是普通的json, 这个可以通过在url中添加一个查询参数来实现: 例如, 追加"?json"(或者&json)

在实践中, 支持jsonp的服务不会强制指定客户端必须实现的回调函数名称, 比如response. 相反它们使用查询参数的值, 允许客户端指定一个函数名,然后使用函数名去填充响应.

//根据指定的url发送一个json请求 
//然后把解析得到的响应数据传递给回调函数 
//在url中添加一个名为jsonp的查询参数, 用于指定该请求的回调函数的名称 
function getJSONP(url, callback){ 
//为本次请求创建一个唯一的回调函数名称 
var cbnum = "cb"+getJSONP.counter++; 
var cbname = "getJSONP."+cbnum; //作为jsonp函数的属性 
//将回调函数名称以表单编码的形式添加到url查询部分中 
if(url.indexOf("?") === -1){ 
url += "?jsonp="+cbname; 
}else{ 
url += "&jsonp="+cbname; 
} 
//创建<script>用于发送请求 
var script = document.createElement("script"); 
//定义被脚本执行的回调函数 
getJSONP[cbnum] = function(response){ 
try{ 
callback(response); //处理响应 
} 
finally{ 
//删除该函数, 并移除相应script元素 
delete getJSONP[cbnum]; 
script.parentNode.removeChild(script); 
} 
} 
//立即触发http请求 
script.src = url; 
document.body.appendChild(script); 
} 
getJSONP.counter = 0;
Javascript 相关文章推荐
爱恋千雪-US-AscII加密解密工具(网页加密)下载
Jun 06 Javascript
一起来写段JS drag拖动代码
Dec 09 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
javascript数组去重常用方法实例分析
Apr 11 Javascript
vue2.0+koa2+mongodb实现注册登录
Apr 10 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
在vue+element ui框架里实现lodash的debounce防抖
Nov 13 Javascript
JavaScript canvas绘制渐变颜色的矩形
Feb 18 Javascript
15分钟上手vue3.0(小结)
May 20 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 Javascript
DIV+CSS+JS不间断横向滚动实现代码
Mar 19 #Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 #Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 #Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
Mar 19 #Javascript
Javascript中valueOf与toString区别浅析
Mar 19 #Javascript
Javascript Throttle &amp; Debounce应用介绍
Mar 19 #Javascript
JS 实现获取打开一个界面中输入的值
Mar 19 #Javascript
You might like
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
TypeScript入门-接口
2017/03/30 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
Python3计算三角形的面积代码
2017/12/18 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
python批量修改ssh密码的实现
2019/08/08 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
护理专业学生的求职信范文
2013/12/11 职场文书
银行职员思想汇报
2013/12/31 职场文书
竞职演讲稿范文
2014/01/11 职场文书
管理专员自荐信
2014/01/26 职场文书
水利学院求职自荐书
2014/02/01 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
2015年社区工作总结
2015/04/08 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
教师节联欢会主持词
2015/07/04 职场文书