三种方式使用 jsonp 实现跨域

2018-05-10  本文已影响24人  刘挚珂

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

注意: 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>

步骤:

二、 使用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>


步骤:

三、 使用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>

步骤:

OK 大功告成!
github源码地址

上一篇下一篇

猜你喜欢

热点阅读