美文网首页
三种方式使用 jsonp 实现跨域

三种方式使用 jsonp 实现跨域

作者: 刘挚珂 | 来源:发表于2018-05-10 23:14 被阅读24次

    之前一直不了解 jsonp 是怎么使用的,工作之余研究了一下,常用的三种方式。

    • 原生 js
    • jQuery
    • vue

    注意: jsonp 只能是 get 请求;

    一、 使用原生 js 实现 jsonp 跨域

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>原生js中jsonp请求</title>
    </head>
    
    <body>
    <div id="box">
        <input type="text" placeholder="请输入搜索内容" id="input" onchange="changeValFn(this)">
        <p id="text"></p>
    </div>
    <script type="text/javascript">
        var boxEl = document.getElementById('box')
        var textEl = document.getElementById('text')
      //  script 标签中 src 加载的资源,服务端返回的一个方法,方法传的参数就是需要的数据
        function cbFn(data){
          console.log('回调'+JSON.stringify(data));
          textEl.innerText = JSON.stringify(data)
        }
    // input 值改变
      function changeValFn(ev){
          var data = ev.value
        var scriptEl = document.createElement('script')
        console.log('ev_'+ev.value);
        scriptEl.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd='+data+'&cb=cbFn'
        boxEl.appendChild(scriptEl)
      }
    </script>
    </body>
    </html>
    
    

    步骤:

    • 监听input 输入框的值改变;
    • 创建script 标签,设置 src 的指向,其中 wd的值是请求的参数,cb的值 是设置的回调函数名称;
    • 将 script 标签插入到 DOM 中;
    • 请求成功后cbFn会执行,数据成功打印;

    二、 使用jQuery 实现 jsonp 跨域

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <title>jQuery ajax jsonp 请求</title>
    </head>
    <body>
    <div id="box">
        <input type="text" placeholder="请输入搜索内容" id="input">
        <p id="text"></p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
    <script>
      $(document).ready(function () {
        $('#input').on('change', function () {
          var data = $(this).val()
          $.ajax({
            url: 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
            type: 'GET',
            data: {wd: data},
            dataType: 'jsonp',  //指定服务器返回的数据类型
            jsonp: 'cb', // 传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
            jsonpCallback: 'sug',  //指定回调函数名称
            success: function (data) {
              console.log(data)
              var result = JSON.stringify(data) //json对象转成字符串
              $('#text').text(result)
            },
            error:function (error) {
              console.log(error)
            }
          })
        })
      })
    </script>
    </body>
    </html>
    
    
    

    步骤:

    • 监听 input 值改变;
    • 使用 jQuery发送 Ajax 请求
    • 返回渲染数据

    三、 使用vue 实现 jsonp 跨域

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <title>Vue jsonp 请求</title>
        <script src="https://cdn.bootcss.com/vue/2.1.7/vue.min.js"></script>
        <script src="https://cdn.bootcss.com/vue-resource/1.3.1/vue-resource.min.js"></script>
    </head>
    <body>
    <div id="box">
        <input type="text" placeholder="请输入搜索内容" v-model='inputText'>
        <ul>
            <li v-if="result" v-for="(item, index) in result">
                {{item}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
      window.onload = function () {
        new Vue({
          el: '#box',
          data: {
            inputText: '',
            text: '',
            nowIndex: -1,
            result: []
          },
          watch:{
            inputText:function (newVal) {
              const that = this
              if(!newVal){
                that.result = []
                return false
              }
              that.getData()
            }
          },
          methods: {
            getData: function() {
              const that = this
              that.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su', {
                params: {
                  wd: that.inputText
                },
                jsonp: 'cb'
              }).then(function (value) {
                that.result = value
              })
            }
          }
        })
      }
    </script>
    </body>
    </html>
    

    步骤:

    • watch 监听input 的值改变,发送请求。
    • 返回数据渲染;

    OK 大功告成!
    github源码地址

    相关文章

      网友评论

          本文标题:三种方式使用 jsonp 实现跨域

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