JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON的一种新方法,在后来的Web服务中非常流行。JSONP看起来与JSON差不多,只不过是被包含在函数中调用的JSON
如下:
callback({"name":"Nicholas"});
JSONP组成
JSONP由两部分组成:回调函数和数据
回调函数
当响应到来时在页面中调用的函数,回调函数的名字一般是在请求中指定的
数据
数据就是传入回调函数中的JSON数据
典型的JSONP请求如下所示:
http://freegeoip.net/json/?callback=handleResponse
这个URL是在请求一个JSONP地理定位服务。通过查询字符串来指定JSONP服务的回调参数是很常见的,像上面的URL所示,指定的回调函数的名字叫做handleResponse()
实现原理
JSONP是通过动态<script>
元素来使用的,首先为src属性指定一个跨域URL。这里的<script>
元素和<img>
,都有能力不受限制地从其他域加载资源。
总结:但凡具有src或者href类似可以引用外部资源的属性的标签都可以实现跨域
因为JSONP是有效的javascript的代码,所以请求完成后,即再JSONP响应加载到页面中以后,就会立即执行。
function handleResponse(response){
alert("You are at IP address" +response.ip+",whitch is in"+response.city +","+response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handleResponse";
document.body.insertBefore(script,document.body.firstChild);
这个例子通过查询地理定位服务来显示你的IP地址和位置信息
JSONP优点
能够直接访问响应文本,支持在浏览器与服务器之间的双向通信
JSONP的不足
1、JSONP从其他域中加载代码执行。如果其他域不安全,很可能会在响应中夹带一些恶意代码
2、要确定JSONP请求是否失败并不容易。虽然HTML5给script元素新增了一个onerror事件处理程序,但目前还没有浏览器支持,因此开发人员不得不使用计时器检测指定时间内是否接收到了响应。
JSONP应用
使用JSONP跨域的步骤:
1、创建一个script标签
2、指定src和type
3、将标签追加到文本内容中
注意:在指定src的时候需要追加callback回调函数,用&连接起来
其他跨域技术
- 服务器代理
- document.domain
- window.name
- CSST
- CORS
- flash
- window.postMessage
- location.hash
- HTML5的WebSocket