1.何为jsonp(json with padding)

  json我们都知道并用过。那么jsonp呢,呃,好像听过,但没用过。很久以来楼主也只是听过这个名词而已。直到今晚楼主看到一篇文章(http://www.cnblogs.com/twobin/p/3395086.html),然后决定探究一下什么是jsonp。

  我们都知道js文件是不能跨域操作内容的,这在js里面叫做‘同源策略’,意即js文件只能操作相同域名、相同端口、相同协议的html文档。但同时我们知道浏览器允许跨源请求<script>资源,例如可以通过指定<script>标签的src属性去请求其它域名的js文件,例如我们常常如此引用jquery文件,<script src = 'code.jquery.com/jquery-latest.min.js'></script>,然后我们就能使用jquery里的方法来任意操作我们html文档里的内容了。

  嗯,jsonp就是利用这一原理实现的跨域访问数据。说白了,其实jsonp技术本质上就是创建<script>标签,并把其src指向跨域地址而实现跨域获取数据。通常的做法就是,异步请求跨域的服务器端时,不直接返回数据而是返回一个js方法调用,将真正的数据作为该js方法调用的参数传过来。

2.jsonp实例

  原理不多说,下面以百度搜索为例讲讲jsonp的用法。当我们在百度首页输入关键字时,会出现下拉联想框。实际当我们在文本框中输入每一个关键字时都会动态构建一个<script>标签,访标签会将我们输入的关键字作为请求参数传递给suggestion.baidu.com。注意图中标红的部分:

在这里创建了<script src="http://suggestion.baidu.com/su?wd=ipad&amp;p=3&amp;cb=window.bdsug.sug&amp;sid=&amp;t=1383236316435" charset="gb2312"></script>。

  该标签src指向的域名是suggestion.baidu.com(三级域名),与我们访问的baidu.com(二级域名)不是同一个域名,在这个请求中我们指定了wd = ipad, cb = window.bgsug.sug,合理推测cb就是baidu.com文档里包含的js方法,该方法会处理从suggestion.baidu.com返回的针对wd = ipad的响应。

  看到这个<script>请求的返回内容,最终我们在baidu.com页面的home.js文件中寻找到了window.bdsug.sug方法:

相关代码如下,

1.其中getDataScript方法根据用户输入的关键字,构建相关的<script>标签向suggestion.baidu.com发起请求

2.bdsug.sug方法为收到suggestion.baidu.com响应后的处理函数

var Request = (function() {
var dataElm;
var cookieSwitch;
function getDataScript(wd) {
var requestUrl = bds.comm.sugHost || "http://suggestion.baidu.com/su";
Request.dm({type: "need_cookie"});
if (dataElm) {
document.body.removeChild(dataElm)
}
dataElm = C("SCRIPT");
dataElm.src = requestUrl + "?wd=" + encodeURIComponent(wd) + "&p=" + cookieSwitch + "&cb=window.bdsug.sug&sid=" + bds.comm.sid + "&t=" + (new Date()).getTime();
dataElm.charset = "gb2312";
document.body.appendChild(dataElm);
addTj({rsv_sug3: ++rsv_sug3});
rsv_temp_time = new Date().getTime();
rsv_temp_flag = false;
rsv_timer = setTimeout(function() {
addTj({rsv_sug4: rsv_sug4 += 5000});
rsv_temp_flag = true
}, 5000)
}
return MessageDispatcher.ini({rm: function(evtObj) {
switch (evtObj.type) {
case "request_data":
getDataScript(evtObj.wd);
break;
case "give_cookie":
var _sug = evtObj.sug;
if (_sug > 0) {
_sug = 3
}
cookieSwitch = _sug;
break
}
}})
})();
bdsug.sug = function(dataObj) {
bdsug.dm({type: "response_data",data: dataObj});
if (!rsv_temp_flag) {
var ipt = G("kw");
if (ipt.value.toLowerCase() == dataObj.q) {
addTj({rsv_sug1: ++rsv_sug1})
}
clearTimeout(rsv_timer);
addTj({rsv_sug4: rsv_sug4 += (new Date().getTime() - rsv_temp_time)})
}
};

 最后我们总结一下整个流程:

1.在baidu.com输入框中键入关键字

2.动态构建<script src="http://suggestion.baidu.com/su?wd=你输入的关键字&amp;p=3&amp;cb=window.bdsug.sug...></script>向suggestion.baidu.com发起请求

3.suggestion.baidu.com返回内容 'window.bdsug.sug({q:"ipad",p:false,s:["ipad4","ipad mini","ipad5","ipad mini2","ipad air","ipad2"}])'

4.调用baidu.com页面home.js中的bdsug.sug方法,构建下拉联想列表。

另见我自己做的百度首页:

http://caochao.github.io/jsonp.html

参见stackoverflow关于what is jsonp的讨论帖子:

http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about

一个小例子讲讲jsonp的更多相关文章

  1. java连接mysql的一个小例子

    想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...

  2. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  3. MVVM模式的一个小例子

    使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...

  4. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  5. 从一个小例子认识SQL游标

    1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...

  6. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  7. Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

    学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...

  8. Spring和Hibernate结合的一个小例子

    1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...

  9. Spring.Net在ASP.NET Mvc里使用的一个小例子

    就贴个小例子,就不注意格式了. 1.下载dll NuGet的下载地址:http://docs.nuget.org/docs/start-here/installing-nuget 在vs的NuGet里 ...

随机推荐

  1. 【原】android通过adb wireless的使用

    开发android程序,总是需要插拔插拔的,usb口都给弄坏掉了,现在adb可以通过无线网,链接处在同一个局域网下面的android设备 1.将电脑和移动设备链接到同一个无线网下 2.在android ...

  2. MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl)

    原文:MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl),沙漠紫风铃 本文介绍了MFC中和状态栏相关的用法: 在MFC的的单文档应用中,在建好应用程序之后,CMa ...

  3. 错误 1 在应用程序级别之外使用注册为 allowDefinition='

    原文:错误 1 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的,银流沙 昨天运行一个.NET网站项目时,出现了以下问题: 在应 ...

  4. memcache redundancy机制分析及思考

    设计和开发可以掌控客户端的分布式服务端程序是件幸事,可以把很多事情交给客户端来做,而且可以做的很优雅.角色决定命运,在互联网架构中,web server必须冲锋在前,注定要在多浏览器版本以及协议兼容性 ...

  5. LeetCode题解——Median of Two Sorted Arrays

    题目: 找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n)). 解法: 更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值. 代码: class Solution { ...

  6. #pragma alloc_text 与 ALLOC_PRAGMA

    百度标题中的两部分,可以找到很多文章,现将收集到的其中两篇整理如下: 转载链接:http://hi.baidu.com/billbeggar/item/c378e2ea39a5daeffa42bada ...

  7. NOIP2012 同余方程

    1同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行 ...

  8. NOIP2014 无线网络发射器选址

    1.无线网络发射器选址 (wireless.cpp/c/pas) [问题描述] 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平 ...

  9. Kotlin 学习

    http://kotlinlang.cn/ 资料: https://segmentfault.com/a/1190000004494727 http://blog.csdn.net/u01413448 ...

  10. Mongodb 和 普通数据库 各种属性 和语句 的对应

    SQL to MongoDB Mapping Chart In addition to the charts that follow, you might want to consider the F ...