jsonp

作者: 嘤嘤嘤998 | 来源:发表于2019-02-09 15:41 被阅读0次

一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题。
不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>、<\iframe>)。

ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取数据,而jsonp的核心则是通过动态添加script标签跨域获取数据。

现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
        var localHandler = function(data){
            alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
        };
    </script>
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>
 
</body>
</html>

remote.js文件代码如下:

localHandler({"result":"我是远程js带来的数据"});

运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。

动态生成script标签

JSONP JS实现

<head>
   <title></title>
   <script type="text/javascript">  */
       // 得到航班信息查询结果后的回调函数
       var flightHandler = function(data){
           alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
       };
       // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
       var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
       // 创建script标签,设置其属性
       var script = document.createElement('script');
       script.setAttribute('src', url);
       // 把script标签加入head,此时调用开始
       document.getElementsByTagName('head')[0].appendChild(script); 
   </script>
</head>  

服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html

flightHandler({
    "code": "CA1998",
    "price": 1780,
    "tickets": 5
});

JSONP JQ实现
只需在$.ajax中添加dataType:"jsonp"

<head>
  <title>跨域测试</title>
  <script src="js/jquery-1.7.2.js"></script>
  <script>
    function showData (data) {          //自定义的callback函数
        console.info("调用showData");              
    }
    $(document).ready(function () {
        $("#btn").click(function () {
            $.ajax({
                url: "http://localhost:9090/student",
                type: "GET",
                dataType: "jsonp",          //指定服务器返回的数据类型
                //jsonp: "theFunction",     //指定参数名称
                jsonpCallback: "showData",  //指定自定义callback
                success: function (data) {      //success是$.ajax自动创建的回调函数
                    console.info("调用success");
                    var result = JSON.stringify(data);
                    $("#text").val(result);
                }
            });
        }); 
    });    
</script>
</head>

相关文章

网友评论

      本文标题:jsonp

      本文链接:https://www.haomeiwen.com/subject/zbbasqtx.html