zoukankan      html  css  js  c++  java
  • 跨域详解之-----Jsonp跨域

    一、通过jsonp跨域

    在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。

    比如,有个a.html页面,它里面的代码需要利用ajax获取一个不同域上的json数据,假设这个json数据地址是https://api.douban.com/v2/book/search?q=javascript&count=1(豆瓣)

    那么a.html中的代码就可以这样:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>JSONP实现跨域2</title>
    </head>
    <body>
        <div id="mydiv">
            <button id="btn">点击</button>
        </div>
    </body>
    <script type="text/javascript">
        function handleResponse(response){             //response参数为接收到的数据               
                console.log(response);
        }
    </script>
    <script type="text/javascript">
        window.onload = function() {                       
    
        var oBtn = document.getElementById('btn');
    
        oBtn.onclick = function() {     
    
            var script = document.createElement("script");                     //动态加载script     
            script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";           //跨域请求 callback参数对应方法
            document.body.insertBefore(script, document.body.firstChild); };           //将script标签加入到body里
    };

    </script>

    </html>

     注:

    我们看到获取数据的地址后面还有一个callback参数,按惯例是用这个参数名,但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的,就得按照提供数据的那一方的规定格式来操作了。

    输出结果为:

    二、jQuery封装JSONP

    对于经常用jQuery的开发者来说,能注意到jQuery封装的$.ajax中有一个dataType属性,如果将该属性设置成dataType:"jsonp",就能实现JSONP跨域了。需要了解的一点是,虽然jQuery将JSONP封装在$.ajax中,但是其本质与$.ajax不一样。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>jQuery实现JSONP</title>
    </head>
    <body>
        <div id="mydiv">
            <button id="btn">点击</button>
        </div>
    </body>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#btn").click(function(){
    
                $.ajax({
                    async : true,
                    url : "https://api.douban.com/v2/book/search",
                    type : "GET",
                    dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
                    jsonp : 'callback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
                    jsonpCallback: 'handleResponse', //设置回调函数名
                    data : {                       //拼接url
                        q : "javascript", 
                        count : 1
                    }, 
                    success: function(response, status, xhr){
                        console.log('状态为:' + status + ',状态是:' + xhr.statusText);
                        console.log(response);
                    }
                });
            });
        });
    </script>
    </html>
    

      

  • 相关阅读:
    工业相机基础知识
    软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询
    一文掌握软件测试常用SQL命令
    PageObject设计模式在 UI 自动化中的实践(QQ 邮箱登陆为例)
    测试开发必备--搞定PO设计模式
    Junit5 + YAML 参数化和数据驱动,让 App 自动化测试更高效(一)
    快速搞定APP移动端自动化测试
    接口自动化测试的 “能” 与 “不能”
    如何精通接口测试?
    测试开发必备:Dubbo-admin+Zookeeper 的环境搭建实操
  • 原文地址:https://www.cnblogs.com/8080zh/p/9289364.html
Copyright © 2011-2022 走看看