模拟百度搜索栏需求分析

1.定义html 和 css

2.找 百度请求 的 接口地址

调出控制台 在 network 中 找 请求响应内容

https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=32818,1426,32855,31660,32706,7517,32447,32846,32761,32912&wd=11&req=2&csor=2&pwd=1&cb=jQuery110205156215317715702_1604042775324&_=1604042775326

三个参数:

1.wd  搜索关键词,也就是 input标签中输入的数据
2.cb  传参的函数名称
3._   时间戳

现在要通过 jsonp 来访问请求 百度搜索栏的数据参数

定义一个 script标签 src请求地址 就是上述地址 把参数换成我们自己的参数

4.程序步骤

(1) 获取标签对象

(2) 给input标签,添加 input事件

让ul显示

a.获取 input中输入的数据
b.获取时间戳
c.提前定义好函数
函数是根据 百度搜索栏,返回的数据,生成li标签
d.创建一个标签节点,是 script标签
e.给script标签 定义 src 属性

定义 src 属性

属性值 是 百度搜索的 接口地址
还需要将 参数 修改为我们自己的数据
关键词是 input标签输入的数据
函数名称
时间戳
将 script 标签,写入到 body的最下方
写入之后,再删除 script 标签

(3) 在 input标签 失去焦点时, 让 ul隐藏

(4) 定义的生成li的函数

1.获取数组
2.如果数组是undefined证明没有搜索到数据,让ul隐藏
执行 return 终止之后的程序
3.有数据,循环遍历数组,生成li标签
4.将 生成的字符串 写入 ul

搜索栏的防抖节流处理

输入数据过快,会一直触发搜索功能
利用 函数的防抖节流,当输入完成时,只触发一次请求
htmlcssjs
    <div>
        <input type="text">
        <ul></ul>
    </div>
    * {
        margin: 0;
        padding: 0;
    }
    ul,
    ol,
    li {
        list-style: none;
    }
    input {
        width: 500px;
        height: 40px;
        display: block;
        margin: 30px auto 0;
        padding: 0 0 0 20px;
    }
    ul {
        width: 500px;
        margin: 0px auto;
        padding: 0 0 0 20px;
        display: none;
    }
    ul>li {
        height: 30px;
        line-height: 30px;
    }
    ul>li:hover {
        color: blue;
    }
    // 1, 获取标签对象
    const oIpt = document.querySelector('input');
    const oUl = document.querySelector('ul');
    // 定义变量存储,延时器
    let time = 0;
    // 2, 我们当前没有输入的历史记录
    //    点击,获取焦点时,不做操作
    //    输入数据的时候,再做操作
    // 给input标签,添加 input事件
    oIpt.addEventListener('input', () => {
        // 防抖,清除延时器
        clearInterval(time);
        // 通过延时器,调用函数程序
        time = setTimeout( f , 1000 );
    })
    // 定义一个函数,作为防抖节流的函数
    function f() {
        // 让ul显示
        oUl.style.display = 'block';
        // 2-1, 获取input中输入的数据
        let kw = oIpt.value;
        // 2-2, 准备时间戳
        const timeObj = new Date();
        let t = parseInt(timeObj.getTime() / 1000);
        // 2-3, 准备一个函数,这个函数就是根据结果,生成ul中li的函数
        // 现在准备的函数叫 setLi

        // 2-4, 根据获取的数据,来获取搜索结果
        // 生成一个 script标签,src的属性是 百度搜索数据接口的地址,参数是我们自己的参数

        // 创建一个标签节点,是script标签
        const s = document.createElement('script');
        // 设定 script标签,src属性
        s.src = `https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=32818,1426,32855,31660,32706,7517,32447,32846,32761,32912&wd=${kw}&req=2&csor=2&pwd=1&cb=setLi&_=${t}`;
        // 将标签节点,写入页面
        // 将 script 标签写入 body
        // 写入的同时,等于会立即执行程序
        const oBody = document.body;
        oBody.appendChild(s);
        // 写入之后,会立即执行,执行之后就删除 script标签
        oBody.removeChild(s);
    }
    // 失去焦点时,让ul隐藏
    oIpt.addEventListener('change', () => {
        // 让ul消失
        oUl.style.display = 'none';
    })
    // 定义生成li的函数
    function setLi(res) {
        // 根据res的结果,也就是 百度搜索接口传给我们的数据
        // 生成 ul中的li
        // 在res 中 有一个 属性 g 存储所有结果

        // 搜索结果,也有可能是没有对应的数据
        // 此时 res.g; 是 undefined
        // arr 存储的是 undefined
        const arr = res.g;
        if (arr === undefined) {
            // 让ul消失
            oUl.style.display = 'none';
            // 执行 return 下方的程序就不执行了
            return;
        }
        let str = '';
        // 生成li
        arr.forEach(v =< {
            str += `<li>${v.q}</li>`;
        })
        // 将字符串也就是li,写入ul
        oUl.innerHTML = str;
    }

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。