借助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 相关文章推荐
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
AngularJS入门教程(一):静态模板
Dec 06 Javascript
jQuery实现表格行上移下移和置顶的方法
May 22 Javascript
jquery实现删除一个元素后面的所有元素功能
Dec 21 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
浅析javascript中的Event事件
Dec 09 Javascript
JS正则表达式验证中文字符
May 08 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
ztree加载完成后显示勾选节点的实现代码
Oct 22 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
php数组分页实现方法
2016/04/30 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
破解Session cookie的方法
2006/07/28 Javascript
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
django使用html模板减少代码代码解析
2017/12/12 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
幼儿园保教管理制度
2014/02/03 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
初中地理教学反思
2016/02/19 职场文书
如何写好活动总结
2019/06/21 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript