Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234910
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1182
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-20 23:47
个人简介

如果人生是一条隐含马尔科夫模型,那维特比算法告诉我已经偏离最优路线了,但如果起点是现在呢?

文章分类

全部博文(19)

文章存档

2020年(2)

2014年(3)

2013年(14)

分类: jQuery

2013-03-21 18:47:26

jsonp非业余探究

本文用于还在为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,也就是说要把服务端返回加上

阅读(1898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~