什么是JSONP?
名词解释:
同源限制
如今如果网页A和网页B不是同源,就无法读取彼此的Cookie、LocalStorage和IndexedDB、无法接触彼此的DOM、无法向非同源地址发送Ajax请求(可以发送,但浏览器拒绝接收响应)
同源
-
协议相同
-
域名相同
-
端口相同(浏览器并没有遵守)
而JSONP就是解决Ajax只能发给同源的地址的这个限制,特点就是简单易用,没有兼容性问题
它的做法如下:
-
网页添加一个
<script>元素,向服务器请求一个脚本,这不受同源政策限制,可以跨域请求。<script src="http://api.foo.com?callback=bar"></script>注意,请求的脚本网址有一个
callback参数(?callback=bar),用来告诉服务器,客户端的回调函数名称(bar)。 -
服务器收到请求后,拼接一个字符串,将 JSON 数据放在函数名里面,作为字符串返回(
bar({...})) -
客户端会将服务器返回的字符串,作为代码解析,因为浏览器认为,这是
<script>标签请求的脚本内容。这时,客户端只要定义了bar()函数,就能在该函数体内,拿到服务器返回的 JSON 数据。
下面通过一个完整的例子来说明:
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.src = src;
document.body.appendChild(script);
}
window.onload = function () {
addScriptTag('http://example.com/ip?callback=foo');
}
function foo(data) {
console.log('Your public IP address is: ' + data.ip);
};
foo({
'ip': '8.8.8.8'
});
由于<script元素请求的脚本直接作为代码执行,所以就直接将作为参数的json作为js对象,直接可以作为Obj使用