jsonp详解

2 篇文章 0 订阅

1.跨域问题

普通的ajax请求普通文件存在跨域无法访问的问题,因为同源策略会被浏览器阻止方法。
同源:协议,地址端口号都相同叫同源,其中任何一个不同都不叫同源。
解决:网页中调用js文件时不受跨域问题影响,也就是说可以访问其他域名下的js,后来
发现所有包含src这个属性的标签都有跨域的能力。因此可以将请求地址放在js的src中
然后利用回调函数来进行跨域访问。

2.简单文件访问实现

远程服务器有一个文件:a.js
<script>
    console.log('此文件为远程不同源文件');
</script>

本地服务器:b.html

<html>
    <script src='https://www.**.com/a.js'>
    </script>
</html>
页面渲染时会调用a.js方法达到访问远程文件的目的。

3.数据访问

本地服务器:b.html

<html>
    <script>
        function getData(data){
            console.log(data);
        }
    </script>
    <script src='https://www.**.com/a.js></script>  //调用a.js中的getData()方法
</html>

远程服务器:a.js

<script>
    getData({
    'msg':'这是远程文件中的数据'
    })
</script>

本地服务器定义一个跟远程服务器中相同的方法。就可获得远程服务器中数据。这就是jsonp

4.具体实现

上面这种数据获取的方法有个问题,因为远程服务器不知道本地服务器需要调用哪个函数,
所以请求时,本地服务器需传递一个参数告诉远程服务器调用哪个方法。约定callback为调用参数

本地服务器:b.html

<html>
    <script>
        function getData(data){
            console.log(data+'这是远程服务器中的数据');
        }
        var url='https://www.**.com/a.js?callback=getData'; //表示希望调用getData方法
        var script=document.createElement('script');
        script.setAttribute('src',url); //动态创建一个src为远程地址的js
        var head=document.querySelector('head');
        head.appendChild(script);
    </script>
</html>

远程服务器:a.js

<script>
    getData({       //与本地服务器的callback相对应
        msg:'这是远程服务器的数据'
    })
</script>


5.jquery封装jsonp

本地服务器b.html

<html>
    <script>
        $(function(){
            $.ajax({
                type:'get',
                async:false,
                url:'https://www.**.com',   
                dataType:'jsonp',       //表示这是个jsonp请求
                jsonp:'callback',       //统一写法,照着写就行了
                jsonpCallback:'getData',    //定义后台回调函数
                success:function(data){ //success会默认调用jsonpCallback中的方法
                    console.log(data);
                }
            });
        });
    </script>
</html>

远程服务器a.js

<script>
    getData({
        msg:'远程数据'
    })
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值