浏览器的同源策略不允许跨域,jsonp是解决跨域的一种方法。但也存在一些缺点,所以跨域最好还是后台进行设置.
原理
- 利用script标签的src属性不受同源策略影响(协议,端口,域名任何一个不同,同源策略都会禁止跨域)
- 通过前端方法作为参数传递到服务器,服务器注入参数后再返还,实现服务器向客户通信
- 只支持get方法
请求过程
- 请求前:创建一个script标签,并给src赋值 url+callback的方法名,并在window上注册这个方法
- 发送请求: 将script添加到页面中,浏览器会发起一个请求
- 数据响应:服务器将返回的数据作为参数和函数名拼接在一起 jsonpCbk({data:”data”})。当浏览器接收到响应数据,由于发起请求的是script,所以相当于直接调用jsonpCbk方法,并且给回调传入了一个参数。
原生js写一个jsonp
1 | // url要请求的地址以及拼接的参数;opts{param: 约定的函数参数,timeout:超时时间,name:指定的函数名,prefix:指定的函数名前缀};fn回调函数 |
以上是参照一个jsonp插件的源码写的 传送门
此方法在调用时需要自己拼接将参数拼接在url后面 opts如果跟后台有约定callback参数名就传{param: 约定参数名} ,没有默认callback