JSONP
一、JSONP的诞生
- 首先,因为ajax无法跨域(浏览器的同源策略), 然后开发者就有所思考
- 其次,开发者发现,
二、举栗子
栗子一
跨域服务器文件: remote.js
alert('来自远方的我');
本地某文件: index.html
...
<script type="text/javascript" src="跨域服务器/remote.js"></script>
...
结论
这边做的就是直接引入一个js,页面将会弹出一个提示窗体,显示 来自远方的我。
栗子二
跨域服务器文件: remote.js
localHandler({"result":"来自远方的我"});
本地某文件: index.html
...
<script type="text/javascript">
var localHandler = function(data){
alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
};
</script>
<script type="text/javascript" src="跨域服务器/remote.js"></script>
...
结论
这边做的是
1、本地定义一个函数
2、引入一个js
3、被引入的js里面,调用这个函数
页面将会弹出一个提示窗体。显示本地函数被跨域的远程js调用成功,并且还接收到了 来自远方的我。
栗子三
跨域服务端提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并响应了.
跨域服务器文件: flightResult.php
flightHandler({
"code":"CA1998",
"price": 1780,
"tickets": 5
});
本地某文件: index.html
...
<script type="text/javascript">
// 得到航班信息查询结果后的回调函数
var flightHandler = function(data){
alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
};
// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
var url = "跨域服务器/flightResult.php?code=CA1998&callback=flightHandler";
// 创建script标签,设置其属性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script标签加入head,此时调用开始
document.getElementsByTagName('head')[0].appendChild(script);
</script>
...
结论
这次我们做的是
1、动态创建脚本
2、url中传递了一个code参数,服务器去做查询CA1998次航班的信息,callback参数告诉服务器,我的本地回调函数叫做flightHandler
3、跨域服务端调用这个函数flightHandler 页面将会弹出一个提示窗体。把票价、余票以及张数给传递回来了。
三、与AJAX的区别是什么?
- ajax和jsonp本质上是不同的东西。
- ajax的核心是通过XmlHttpRequest获取非本页内容
- jsonp的核心则是动态添加