JSONP的原理
来源:互联网 发布:苏有朋斥周杰炒作知乎 编辑:程序博客网 时间:2024/05/18 03:42
今天看面试题看到了JSONP的实现,而且上次面试也被问到了,虽然回答出来了,但还是需要整理一下。
本文先介绍JSONP的实现原理,介绍几个例子。关于JSON是什么,我会在下一篇介绍。
WHY
Ajax直接请求一般文件存在跨域无权限访问的问题,而我们发现凡是拥有src属性的标签都拥有跨域能力,比如<script>、<img>、<iframe>,于是可以判断,可以利用这些标签跨域访问数据,也就是在远程服务器上设法把数据装进js格式的文件里,供客户端进一步处理。
HOW
JSONP实现原理:
1、首先在客户端注册一个callback(也就是写一个回调函数),然后把callback的名字传递给服务器
2、服务器先生成json数据,然后以js语法的方式,生成一个函数,函数名就是callback传递的回调函数名
3、然后服务器将json数据直接以入参的方式,放到function中,这样就生成了一段js语法的文档,返回给客户端。
4、客户端浏览器,解析script标签,并执行返回的js文件,动态执行回调函数。
Examples
下面我们逐步解释这个原理:
静态方式:
1、现在远程服务器remoteserver.com根目录下有一个remote.js文件代码如下(服务端代码):
alert('我是远程文件’);
本地服务器localserver.com下有个jsonp.html页面代码如下(客户端代码):
<!DOCTYPE html><html><head> <title>"jsonp的实现方式"</title> <script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head> </html>
毫无疑问,页面会弹出一个提示窗,显示“我是远程文件”。
2、现在我们在jsonp.html里定义一个函数,然后从远程remote.js中传入数据进行调用。
<!DOCTYPE html><html><head> <title>"jsonp的实现方式"</title> <script type="text/javascript"> function jsonCallback(data){ alert(data.result); }; <script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head> </html>
remote.js文件代码如下:
jsonCallback({“result”:”我是远程js带来的数据”});
运行之后,页面成功弹出提示窗口。这样跨域远程获取数据的目的实现了,但是又有一个问题出现了,jsonp的服务者有很多服务对象,远程js怎么知道它应该调用的本地函数叫什么名字呢?
3、只要服务端提供的js脚本是动态生成的就行了,这样调用者可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,请你给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。
动态方式
<!DOCTYPE html><html><head> <title>"jsonp的实现方式"</title> <script type="text/javascript"></script> function jsonCallback(data){ alert(data.result); } var url="http://remoteserver.com?callback=“jsonCallback"; var script=document.createElement("script"); script.setAttibute('src',url); document.getElementByTagName('head')[0].appendChild("script");</head></html>
这样就可以了!!
是不是很简单。
参考:
http://kb.cnblogs.com/page/139725/
0 0
- Jquery的Jsonp原理
- JSONP的原理
- jsonp的简单原理
- jsonp的原理
- :jsonp的原理
- jsonp的原理
- JSONP的原理
- JSONP的原理
- jsonp的原理
- webjs -- jsonp的原理
- JSONP的原理
- JSONP 的工作原理
- JSONP 的工作原理
- JSONP 的工作原理,JSONP Demo讲解
- jsonp的工作原理 跨域
- jsonp 的原理和使用
- jsonp 的原理与实现
- 浅谈JSONP 的工作原理
- 一个小目标-整理一生的知识,不断凝练升华
- Github 常用命令介绍
- 剑指offer-40.数组中只出现一次的数字
- 我的第一篇博客
- Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
- JSONP的原理
- JSP传递数组给JS的方法
- android 四大组件之ContentProvider
- 校招结束offer多了也是一种忧愁,要怎么选择?
- TEA加密算法
- JavaScript进阶
- 在源码中编译spidev_test.c
- Java RMI之HelloWorld篇
- 我的 github 地址