先前因为没工作需要,不存在需要跨域访问的应用,一直没接触过JSONP,只是了解个大概意思,即是插入一个SCRIPT标签,设置src,让浏览器加载并自动运行,但具体怎么过程,有什么常见的约定等等不甚了解,今天有机会接触了,具体说一下.
1. 其实JSONP也是一个”hack”应用
由于以前的应用没现在这么复杂,跨域访问浏览器端没提供标准的方法(可能那时还根本没考虑过..),当各种应用不断的丰富之后,需求也随之而来了,既然需求来了,但浏览器没提供直接的实现,此时就只能根据已有功能,玩些雕虫小技,待转几个弯,兜几个圈之后,JSONP就出来了.
2. hack的背后实现
浏览器加载标签的静态资源是可以跨域访问的,如常见的 link:href, script:src,img:src等等,没有安全限制,可直接访问,JSONP正是利用了这个特点,加载不同域上的脚本文件.
待把脚本script标签插入DOM上的head标签内,并设置好src属性时,浏览器就开始加载脚本,脚本下载完后直接运行返回的文本内容.
3. 我们需要的是数据而非源码
hack的过程已经了解,但目前为止作用不大,因为浏览器连接返回后获得资源就是JavaScript源码,并会立即执行这些源码,你无法异想天开的将这文本放到一个可控的eval里运行之后获得结果.假如这源码是任意的,那运行过程根本无法控制,而我们需要的是数据,而非源码!
要想控制这些源码,获得脚本运行的控制权,把源码转换成我们需要的数据,就得有个约定.
4. 普遍的相关约定
既然浏览器一定会自动执行返回的脚本这个客观事实改变不了,我们可以在返回的文本上做点处理,和服务器端作个约定,把个已在存在的回调函数写在外面,再把数据当作参数传递,当浏览器运行返回源码的时候,将调用这个回调函数,这样,控制权又从浏览器传回到我们的手中,数据即参数,也有了,可以为所欲为.
这过程中回调函数的名称是要确定的,通常是在发起前把回调函数名称以提交参数的形式写在URL中,服务器再从提交参数中把这回调函数名称输出到客户端.
如,存在一个全局回调函数 function jsonp_callback(data){ alert(data.a); }
发起时 : jsonp.connect(‘http://www.example.com/getdata.php?callback=jsonp_callback’);
//
在服务器端发现这个callback参数值为jsonp_callback,将输出类似的文本
jsonp_callback( /**数据*/{a:’b’} );
浏览器端请求返回后将立即运行 jsonp_callback( /**数据*/{a:’b’} );
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容