zoukankan      html  css  js  c++  java
  • 网络系列之 jsonp 百度联想词

    jsonp 可以跨域,ajax 不可以,ajax 会受到浏览器的同源策略影响,何为同源策略? 

    同源策略就是,如果 A 网站 想拿 B网站里的资源, 那么 有三个条件, 你得满足才能拿。

      第一个:域名相同。 (www.baidu.com)  

      第二个:协议相同。 ( http    https )

      第三个:端口相同。 ( http 默认为 80 ) ( https 默认为 443)

    例如百度:https://www.baidu.com/

      域名为:www.baidu.com

      协议为:https

      端口号:443(https协议的,没显示出来,默认就是 443)

    那么下面谁可以在百度拿东西呢?

      1. http://www.baidu.com   (协议不同)

      2. http://www.google.com    (域名不同)

      3. https://www.baidu.com/s?  (可以的)

    不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>)。

    举个例子:

    事实证明,具有 src属性的 标签,可以跨域获取文件

    下面,利用 jsonp 制作百度联想词:

    在百度搜索框,打字,下面出现的下拉列表就是 联想词,先看看,百度的效果

    然后找到百度的接口链接:

    上代码:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            * {
                padding: 0;
                margin: 0;
                list-style: none;
            }
    
            .wra {
                margin: 50px 0 0 100px;
            }
    
            input {
                width: 440px;
                height: 30px;
            }
    
            ul {
                display: none;
                width: 440px;
                border: 1px solid #ccc;
            }
    
            ul li {
                width: 522px;
                color: #000;
                font: 14px arial;
                line-height: 22px;
                padding: 0 8px;
                position: relative;
                cursor: default;
            }
        </style>
    </head>
    
    <body>
        <div class="wra">
            <input type="text">
            <ul></ul>
        </div>
        <script>
            var oinput = document.getElementsByTagName('input')[0];
            var body = document.getElementsByTagName('body')[0];
    
            oinput.oninput = function () { //监听 input 事件。每次触发,我们就发利用  script标签的 src  发送请求
                var oscript = document.createElement('script'); 
                oscript.src = 'https://www.baidu.com/sugrec?&prod=pc&wd=' + this.value + '&cb=Exhibition'; //拿到百度接口链接, 删除对我们无用的 参数。
                                                                  // wd 后面的  是我们的 词  cb 后面 是我们的下面的函数名。注意这里的函数名,要字符串
                body.appendChild(oscript);
                oscript.remove();           // 每次发送完数据后, 把 script标签给删除,不然每发送一次,就 创建一个标签, 等下页面会有很多 script标签
            }
    
            function Exhibition(data) {
                var g = data.g;
                var str = '';
                var oUl = document.getElementsByTagName('ul')[0];
                if (g) {
                    oUl.style.display = 'block';
                    g.forEach(function (ele, index) {
                        str += '<li>' + ele.q + '</li>'  //拿到数据  遍历它,然后添加到  li标签
                    })
                    oUl.innerHTML = str;
                }
            }
        </script>
    </body>
    
    </html>

    效果图:

  • 相关阅读:
    生成XML文件
    webService的发布与调用
    does not contain bitcode ShardSDK等三方库
    IOS在Document目录下创建文件夹、保存、读取、以及删除文件
    判断IOS安装后是否是第一次启动
    OC中使用单例模式
    两个时间(日期)段交集判断方法
    $(document).ready vs. $(window).load
    基于vant上传图片添加水印
    常用的正则校验
  • 原文地址:https://www.cnblogs.com/yanggeng/p/11166889.html
Copyright © 2011-2022 走看看