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 相关文章推荐
使用JQuery和s3captche实现一个水果名字的验证
Aug 14 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
Angular实现预加载延迟模块的示例
Oct 12 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 Javascript
小程序接入腾讯位置服务的详细流程
Mar 03 Javascript
JS继承实现方法及优缺点详解
Sep 02 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 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
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
eclipse php wamp配置教程
2016/06/30 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
JS跨域代码片段
2012/08/30 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python读取二进制mnist实例详解
2017/05/31 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
快速创建python 虚拟环境
2020/11/28 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
党员个人整改措施
2014/10/24 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
邀请函的格式
2015/01/30 职场文书
环卫工作个人总结
2015/03/04 职场文书
三八妇女节致辞
2015/07/31 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python