为什么要知道jsonp,jsonp的作用是什么:
同源策略介绍:
针对同源策略的解决办法:
CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制;
jsonp的设置:
jsonp的原理:(面试重点)
- 动态创建script标签,src属性指向没有跨域限制;指向一个接口,接口返回的格式一定是***()函数表达式
代码解释:
- <button id="mybtn">jsonpbutton>
-
- <script>
- //调用这个数据里面的函数,拿回来请求的数据
- function callbackFunction(obj) {
- console.log(obj)
- }
-
- mybtn.onclick = function () {
- var oscript = document.createElement("script")//动态创建script节点
- oscript.src = `https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction`//请求数据的地址
- document.body.appendChild(oscript)//将节点插入到body里面
- }
- script>
设置jsonp要满足的条件是:就是满足原理的几点
把这个函数名改成我们自己定义的,访问这个地址:
结果:
然后结果也能拿到我们要的数据:
jsonp设置的缺点:
两个缺点:
- onload删除script标签;
- 只能get请求,不能post、put、patch、delete请求;
删除代码:
- oscript.onload = function(){
- //删除当前节点
- oscript.remove()
- }
完整代码:
- <button id="mybtn">jsonpbutton>
- <script>
- //调用这个数据里面的函数,拿回来请求的数据
- function test(obj) {
- console.log(obj)
- }
- mybtn.onclick = function () {
- var oscript = document.createElement("script")//动态创建script节点
- oscript.src = `https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=test`//请求数据的地址
- document.body.appendChild(oscript)//将节点插入到body里面
-
- oscript.onload = function(){
- //删除当前节点
- oscript.remove()
- }
- }
- script>
这里纠正一个错误的认识:
- 有些人可能觉得既然要把插入的script删掉,那就当初不要插入标签,因为第二步设置完了src路径以后,不就拿到数据了。
- 不是的
- 这里是第一步创建script标签,第二步设置src路径,第三步是将script标签插入到body里;
- 只有当最后一步将script标签插入到body里才能拿到数据,并不是第二步就拿到数据了;
- 所以我们需要先把script标签插入到body里,然后拿到数据以后,再删除script标签。