首页 > Web开发 > 详细

Jsonp的原理

时间:2019-08-14 17:41:05      阅读:87      评论:0      收藏:0      [点我收藏+]

  其本质是利用了script标签具有可跨域的特性,由服务端返回预先定义好的javascript函数调用,并且将服务端数据以该函数参数的形式传递过来。

一、代码

  • 客户端:

  为什么要定义callback?首先我们知道,这个get请求发出去后如何接口请求回来的数据,callback=func则可以帮我们做这件事。(需要在客户端声明一个与callback=“func”的func同名的函数,通过jsonp方式成功接收到服务器数据的时候就会自动触发这个回调函数)

<button id="btn">点击</button>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
    $(‘#btn‘).click(function(){
        var frame = document.createElement(‘script‘);
        frame.src = ‘http://localhost:3000/article-list?name=leo&age=30&callback=func‘;
        $(‘body‘).append(frame);
    });
    function func(res){
        alert(res.message+res.name+‘你已经‘+res.age+‘岁了‘);
    }
</script>
  • 服务端:
router.get(‘/article-list‘, (req, res) => {
  console.log(req.query, ‘123‘);
  let data = {
    message: ‘success!‘,
    name: req.query.name,
    age: req.query.age
  }
  data = JSON.stringify(data)
  res.end(‘func(‘ + data + ‘)‘);
});

二、举例

  1.通过原生js方式使用jsonp

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        ul{
            background-color: #ccc;
            width: 172px;
        }
    </style>
</head>
<body>
    <input type="" name="" id=‘inp‘>
    <ul>
		
    </ul>
    <script type="text/javascript">
    //1获取input
    //2.注册事件,获取value
    //3动态创建script
    //4追加到body、
    var inp = document.getElementById(‘inp‘)
    var ul = document.querySelector(‘ul‘)
    function suggest_so(data){
        console.log(data)
        var {result} = data
        ul.innerHTML = ‘‘
        for(var i =0;i<result.length;i++){
            // 创建li
     	    var li = document.createElement(‘li‘)
     	    li.innerHTML = result[i].word;
     	    ul.appendChild(li)
         }
    }
    inp.oninput = function(){
        // 判断创建script是否一致
        if(document.getElementsByClassName(‘ss‘).length>0){
            document.getElementsByClassName(‘ss‘)[0].remove()
        }
        var val = inp.value;
        var jsonp = document.createElement(‘script‘)
        jsonp.src = ‘https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word&word=‘+val
        jsonp.className = ‘ss‘
        document.body.appendChild(jsonp)
}
</script>
</body>
</html>                                 

  2.通过jQuery封装的ajax方式使用jsonp

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
        list-style: none;
      }
      ul {
        background-color: #ccc;
        width: 172px;
      }
    </style>
    <script type="text/javascript" src="jquery-1.12.1.js"></script>
    <script type="text/javascript" src="template-web.js"></script>
  </head>
  <body>
    <input type="" name="" id="inp" />
    <ul></ul>
    <script type="text/html" id="tpl">
      {{each result value}}
      <li>{{value.word}}</li>
      {{/each}}
    </script>
    <script type="text/javascript">
      $(function(){
      	$(‘#inp‘).on(‘input‘,function(){
      		$.ajax({
      			url:‘https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word&word=‘+$(this).val(),
      			dataType:‘jsonp‘,
      			jsonpCallback:‘suggest_so‘,
      			success:function(data){
                        var {result} = data;
                        var str = template(‘tpl‘,{result})
                        $(‘ul‘).html(str)
            }
      		})
      	})
      })
    </script>
  </body>
</html>

Jsonp的原理

原文:https://www.cnblogs.com/belongs-to-qinghua/p/11353154.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!