借助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 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
web css实现整站样式互相切换
Oct 29 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
jquery常用操作小结
Jul 21 Javascript
基于jquery实现左右按钮点击的图片切换效果
Jan 27 Javascript
JS中mouseover和mouseout多次触发问题如何解决
Jun 06 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
js制作简单的音乐播放器的示例代码
Aug 28 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
js中!和!!的区别与用法
May 09 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实现利用MySQL保存session的方法
2014/08/23 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
python日期相关操作实例小结
2019/06/24 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
关于python中的xpath解析定位
2020/03/06 Python
学习Python列表的基础知识汇总
2020/03/10 Python
《维生素c的故事》教学反思
2014/02/18 职场文书
分公司任命书
2014/06/06 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
党员年终个人总结
2015/02/14 职场文书
护士岗位竞聘书
2015/09/15 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL