如果人生是一条隐含马尔科夫模型,那维特比算法告诉我已经偏离最优路线了,但如果起点是现在呢?
分类: jQuery
2013-03-21 18:47:26
本文用于还在为jsonp感到迷茫的同学解惑,我也是刚刚才豁然开朗的。
下面给出两种解答方式,一来鉴别一下同学们对jsonp理解到什么程度了,二来对号入座提供能正确的解答方法
我认为json应该跟jsonp是一样原理的
出于这种理解的同学十有八九是被jquery带上道的,不就是在dataType后面多配加一个‘p’嘛,
其实不然,多加一个字符jq框架代替开发者做了一大堆事;而这一切差异的起点就是success函数(即对ajax返回的处理函数)的调用者:json正如大家理解的那样,是用户浏览器在发起调用,但是jsonp从某种意义上讲是服务端在发起调用,我之所以这么说的理由如下
大家看看的字符串有什么特点,是不是像XQScript_1函数以{ result : false }
这个入参在执行?没错,虽然实际情况是服务端不可能有js运行时、这段调用代码只能回传到浏览器才能真正执行,但是调用是由服务端发起却是千真万确的,这时候,客户端js运行时那里只需要有一个名为XQscript_1的函数即可达到跨域的目的。
总结一下,json服务端返回的是最原始的xmlhttprequest,但是jsonp不能这么直接,得把原始数据伪装成一次js函数调用给拍回浏览器去(浏览器误以为这是一段js可执行代码而不是数据对象,进而放它通过),这才是两者最根本的区别。
我认为json应该跟jsonp不是一样原理的
出于这种理解的同学无非两类,第一不知道json是啥的,那先去恶补一下再回来;第二,跳到第一步看完后再回来,因为下面要揭露jq框架的jsonp实现了。
定位到第8361行(或者搜ajaxPrefilter函数),入参s的原型是jQuery.ajax( [settings ] ),跳到这一行:
s.dataTypes[ 0 ] = "json";//露出原型了吧,还是当作json类型的数据返回
overwritten( responseContainer[ 0 ] );//注册好回调:一旦有返回,将其交给overwritten函数调用,也就是最开始注册的回调函数,默认是success
return "script";//该ajaxPrefilter最后返回的是script,也就是说要把服务端返回加上标签当成一段脚本来执行。
总结一下jq是如何实现jsonp的,第一生成一个跟服务端返回一样的函数(图片中的XQScript_1)并注册之,第二将服务端的返回当作script来处理,同时第一步正好生成了个同名的函数,外面看起来就跟json一样。