jsonp跨域请求的原理

首先我们知道在HTML中img和script标签中的链接是可以访问到的,不会收到浏览器的跨域拦截。jsonp请求就是利用这个原理。
jsonp请求会在请求路径最后添加callback=func,服务器收到请求,将数据放到函数参数的位置例如func({code:0}),这个字符串返回,然后前端收到数据立刻执行函数

看代码

<body>
  <input type="text" placeholder="请输入查询">
</body>
<script>
  const input = document.querySelector('input');
  input.addEventListener('input', handleChange);

  function handleChange(event) {
    //console.log(event.target.value)
    jsonp("https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33799,33823,31660,33848,33760,33855,33607,26350&wd="
    +event.target.value+"&req=2&csor=1",'getData')
  }
  function jsonp(url,callback) {
    let temp = document.createElement('script')
    temp.src = url+'&cb='+callback
    document.body.appendChild(temp)
  }
  function getData(response) {
    console.log("服务器返回的数据",response)
  }
</script>

上面例子用的百度搜索的API,最后的回调函数的的参数为cb,我们设置参数值为指定的函数名字符串即可。
用户输出后,监听函数执行,调用jsonp,函数生成一个script标签,给它添加src,src最后设置cb=getData,最后注入页面(这一步很关键),当数据请求完成就会调用callback。

增加显示和移除增加的script

<body>
  <input type="text" placeholder="请输入查询">
  <ul id='slist'></ul>
</body>
<script>
  const input = document.querySelector('input');
  input.addEventListener('input', handleChange);

  function handleChange(event) {
    //console.log(event.target.value)
    jsonp("https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33799,33823,31660,33848,33760,33855,33607,26350&wd=" + event.target.value + "&req=2&csor=1", 'getData')
  }
  function jsonp(url, callback) {
    let temp = document.createElement('script')
    temp.src = url + '&cb=' + callback
    document.body.appendChild(temp)
    //移除,但请求已经发送了
    document.body.removeChild(temp)
  }
  function getData(response) {
    console.log("服务器返回的数据", response)
    //显示数据
    let fragment = document.createElement('ul')

    if (!response.g) {
      return
    }
    let len = response.g.length
    for (let i = 0; i < len; i++) {
      let li = document.createElement('li')
      li.innerText = response.g[i].q
      fragment.appendChild(li)
    }
    const item = document.querySelector('#slist')
    while (item.firstChild) {
      item.removeChild(item.firstChild)
    }
    document.getElementById('slist').appendChild(fragment)
  }

</script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值