• Jsonp的原理


      其本质是利用了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;
                 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;
             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>
  • 相关阅读:
    十二月十学习报告
    十二月八学习报告
    十二月七学习报告
    学习笔记187—在线会议共享PPT时,设置让观众看不到备注,而自己能看到【腾讯会议】
    学习笔记186—打印机可以打印测试页,但是通过WPS或Word无法打印文档?
    《程序员的自我修养》读书有感 其一
    Linux下的单向ping通问题
    做一个Pandas专家,教你如何用它高效处理大量数据
    grpc python 源码分析(1):server 的创建和启动
    grpc python 源码分析(2):server 处理请求
  • 原文地址:https://www.cnblogs.com/belongs-to-qinghua/p/11353154.html
Copyright © 2020-2023  润新知