Jsonp 跨域的原理以及Jquery的解决方案


Posted in Javascript onMay 18, 2010

原理:JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。
个人理解:

就是在客户端动态注册一个函数function a(data),然后将函数名传到服务器,服务器返回一个a({/*json*/})到客户端运行,这样就调用客户端的function a(data),从而实现了跨域.

<!DOCTYPE html PUBLIC "-//W//DTD XHTML Transitional//EN" "http://www.worg/TR/xhtmlDTD/xhtmltransitional.dtd"> 
<html xmlns="http://www.worg/xhtml" > 
<head> 
<title>Test Jsonp</title> 
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js" type="text/javascript"></script> 
<script type="text/javascript"> 
function jsonpCallback(result) 
{ 
$.each(result.items, function(i,item){ 
$("<img/>").attr("src", item.media.m).appendTo("body"); 
if ( i == 3 ) return false; 
}); 
} 
</script> 
</head> 
<body> 
<script type="text/javascript" src="http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=jsonpCallback"></script> 
</body> 
</html>

jQuery的解决方案:

<!DOCTYPE html PUBLIC "-//W//DTD XHTML Transitional//EN" "http://www.worg/TR/xhtmlDTD/xhtmltransitional.dtd"> 
<html xmlns="http://www.worg/xhtml" > 
<head> 
<title>Test Jsonp</title> 
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(function() { 
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) { 
$.each(data.items, function(i, item) { 
$("<img/>").attr("src", item.media.m).appendTo("body"); 
if (i == 3) return false; 
}); 
}); 
}); 
</script> 
</head> 
<body></body> 
</html>

jquery 的jsoncallback是动态生成的,真正请求服务器的地址:http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=jsonp1274058545738

Javascript 相关文章推荐
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
Jan 24 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
Nov 27 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
Angular整合zTree的示例代码
Jan 24 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
js中this的指向问题归纳总结
Nov 28 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
js实现移动端轮播图滑动切换
Dec 21 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
May 18 #Javascript
JS request函数 用来获取url参数
May 17 #Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
May 17 #Javascript
JQuery中的ready函数冲突的解决方法
May 17 #Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 #Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 #Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 #Javascript
You might like
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
php数组和链表的区别总结
2019/09/20 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JavaScript中Array方法你该知道的正确打开方法
2018/09/11 Javascript
js实现蒙版效果
2020/01/11 Javascript
Python3基础之list列表实例解析
2014/08/13 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
python生成word合同的实例方法
2021/01/12 Python
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
学年末自我鉴定
2014/01/21 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
学生安全责任书模板
2014/07/25 职场文书
离职报告范文
2014/11/04 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
环境卫生整治简报
2015/07/20 职场文书
导游词之五台山
2019/10/11 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers