什么是JSONP?

150 阅读1分钟

什么是JSONP?

名词解释:

同源限制

如今如果网页A和网页B不是同源,就无法读取彼此的Cookie、LocalStorage和IndexedDB、无法接触彼此的DOM、无法向非同源地址发送Ajax请求(可以发送,但浏览器拒绝接收响应)

同源

  • 协议相同

  • 域名相同

  • 端口相同(浏览器并没有遵守)

而JSONP就是解决Ajax只能发给同源的地址的这个限制,特点就是简单易用,没有兼容性问题

它的做法如下:

  1. 网页添加一个<script>元素,向服务器请求一个脚本,这不受同源政策限制,可以跨域请求。

    <script src="http://api.foo.com?callback=bar"></script>
    

    注意,请求的脚本网址有一个callback参数(?callback=bar),用来告诉服务器,客户端的回调函数名称(bar)。

  2. 服务器收到请求后,拼接一个字符串,将 JSON 数据放在函数名里面,作为字符串返回(bar({...})

  3. 客户端会将服务器返回的字符串,作为代码解析,因为浏览器认为,这是<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使用