WebApi入门第八章(模拟百度搜索框 )

简介: WebApi入门第八章(模拟百度搜索框 )

需求:


需求1:用户输入关键字,我们想办法获取到用户输入的关键字,然后去“服务器”数组匹配:匹配成功,将词条显示在输入框下面


需求2:鼠标移入变色,移出变回去


需求3:点击li,将li的数据放到输入框中,不再提示


需求4: 用户任意输入一个不存在的关键字 点击search的时候就将数据保存起来 下次就有这个词条


服务器数据:


["海海","海海有女朋友吗", "海海是谁", "广东人", "广东人爱吃", "广东人爱吃什么", "广东人什么都吃", "小米", "小米雷军", "小米手机", "", "小米回应收购恒大", "阿里", "阿里跌8200亿元成最大输家","苹果", "苹果乔布斯", "苹果以15.8万亿价值蝉联", "苹果一块一斤", "苹果笔记本"];


效果图


用户输入关键字就会弹出弹框

20210821095925977.gif


基本样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            font-size: 20px;
        }
        .box {
            width: 600px;
            height: 40px;
            margin: 200px auto;
            position: relative;
        }
        #txt {
            width: 498px;
            height: 38px;
            border: 1px solid #ccc;
            font-size: 20px;
        }
        #search {
            width: 100px;
            height: 40px;
        }
        #keywords {
            position: absolute;
            top: 40px;
            left: 0;
            background-color: #6cf;
            list-style: none;
            width: 500px;
        }
        li {
            line-height: 24px;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="top">
            <input type="text" id="txt" /><input type="button" value="search" id="search" />
        </div>
        <ul id="keywords">
        </ul>
    </div>
</body>
</html>


思路分析

   思路分析
            补充技术:用户输入的事件  oninput onkeyup onkeydown
                只要用户输入内容:就会触发事件
            1. 获取事件源:#txt
            2. 确定事件类型:oninput
            3. 事件处理
            3.1 获取用户输入的数据:input框的value属性
            3.2 用户每输入多一个内容(或者少):应该先清空原来匹配的结果:ul.innerHTML = '';
            3.3 安全处理:用户输入的数据,有可能带空格,一般需要帮助用户去除两边的空格:目标字符串.trim():去除目标两边的空格
            3.4 安全处理:如果用户输入的字符串是空的(没有输入):不需要进行服务器处理(下一步没有必要执行):结束事件函数;return
            3.5 去服务器匹配数据:但是不是去数组中找,而是遍历数组:看数组的元素中是否包含用户输入的关键字
            3.5.1 判定:词条中是否包含用户输入的关键字:词条.indexOf(关键字) != -1 :包含关键字
            3.5.2 将关键字放到li中,放到ul#keywords下
            3.5.2.1 创建li:document.createElement('li')
            3.5.2.2 添加内容:li.innerText = 词条
            3.5.2.3 将li放到ul中


完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            font-size: 20px;
        }
        .box {
            width: 600px;
            height: 40px;
            margin: 200px auto;
            position: relative;
        }
        #txt {
            width: 498px;
            height: 38px;
            border: 1px solid #ccc;
            font-size: 20px;
        }
        #search {
            width: 100px;
            height: 40px;
        }
        #keywords {
            position: absolute;
            top: 40px;
            left: 0;
            background-color: #6cf;
            list-style: none;
            width: 500px;
        }
        li {
            line-height: 24px;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="top">
            <input type="text" id="txt" /><input type="button" value="search" id="search" />
        </div>
        <ul id="keywords">
        </ul>
    </div>
    <script>
        // 需求1:用户输入关键字,我们想办法获取到用户输入的关键字,然后去“服务器”数组匹配:匹配成功,将词条显示在输入框下面
        /*
            思路分析
            补充技术:用户输入的事件  oninput onkeyup onkeydown
                只要用户输入内容:就会触发事件
            1. 获取事件源:#txt
            2. 确定事件类型:oninput
            3. 事件处理
            3.1 获取用户输入的数据:input框的value属性
            3.2 用户每输入多一个内容(或者少):应该先清空原来匹配的结果:ul.innerHTML = '';
            3.3 安全处理:用户输入的数据,有可能带空格,一般需要帮助用户去除两边的空格:目标字符串.trim():去除目标两边的空格
            3.4 安全处理:如果用户输入的字符串是空的(没有输入):不需要进行服务器处理(下一步没有必要执行):结束事件函数;return
            3.5 去服务器匹配数据:但是不是去数组中找,而是遍历数组:看数组的元素中是否包含用户输入的关键字
            3.5.1 判定:词条中是否包含用户输入的关键字:词条.indexOf(关键字) != -1 :包含关键字
            3.5.2 将关键字放到li中,放到ul#keywords下
            3.5.2.1 创建li:document.createElement('li')
            3.5.2.2 添加内容:li.innerText = 词条
            3.5.2.3 将li放到ul中
        */
        // 补充技术:用户输入的事件  oninput onkeyup onkeydown
        //         只要用户输入内容:就会触发事件
        const keywords = ["海海", "海海有女朋友吗", "海海是谁", "广东人", "广东人爱吃", "广东人爱吃什么", "广东人什么都吃", "小米", "小米雷军", "小米手机", "", "小米回应收购恒大", "阿里", "阿里跌8200亿元成最大输家","苹果", "苹果乔布斯", "苹果以15.8万亿价值蝉联", "苹果一块一斤", "苹果笔记本"];
        // 词条:模拟百度的关键词提示
        //     1. 获取事件源:#txt
        let txt = document.getElementById('txt');
        let ul = document.getElementById('keywords');
        // console.log(txt);
        // console.log(ul);
        //     2. 确定事件类型:oninput
        txt.oninput = function () {
            //     3. 事件处理
            //     3.1 获取用户输入的数据:input框的value属性
            // console.log(txt.value);
            let value = txt.value;
            // console.log(value);
            //     3.2 用户每输入多一个内容(或者少):应该先清空原来匹配的结果:ul.innerHTML = '';
            ul.innerHTML = '';
            //     3.3 安全处理:用户输入的数据,有可能带空格,一般需要帮助用户去除两边的空格:目标字符串.trim():去除目标两边的空格
            value = value.trim();
            // console.log(value);
            //     3.4 安全处理:如果用户输入的字符串是空的(没有输入):不需要进行服务器处理(下一步没有必要执行):结束事件函数;return
            if (value.length == 0) {
                return;
            };
            keywords.forEach(function (item) {
                // console.log(item);
                //     3.5 去服务器匹配数据:但是不是去数组中找,而是遍历数组:看数组的元素中是否包含用户输入的关键字
                //     3.5.1 判定:词条中是否包含用户输入的关键字:词条.indexOf(关键字) != -1 :包含关键字
                if (item.indexOf(value) != -1) {
                    //     3.5.2 将关键字放到li中,放到ul#keywords下
                    //     3.5.2.1 创建li:document.createElement('li')
                    let li = document.createElement('li');
                    //     3.5.2.2 添加内容:li.innerText = 词条
                    li.innerText = item;
                    //     3.5.2.3 将li放到ul中
                    ul.appendChild(li);
                    // console.log(lis);
                    // 需求2:鼠标移入变色,移出变回去
                    /*
                        思路分析
                        1. 事件源:li
                        2. 事件类型:鼠标移入 onmouseover 鼠标移出 onmouseout
                        3. 事件处理
                        3.1 鼠标移入:修改当前li的背景色:li.style.backgroundColor = '具体颜色'
                        3.2 鼠标移出:修改当前li的背景色:li.style.backgroundColor = ''
                    */
                    // 移入事件 
                    li.onmousemove = function () {
                        // li.setAttribute('date-color', backgroundColor);
                        this.style.backgroundColor = 'yellow';
                    };
                    // 移出事件
                    li.onmouseout = function () {
                        this.style.backgroundColor = '';
                    };
                    // 需求3:点击li,将li的数据放到输入框中,不再提示
                    /*
                        思路分析
                        1. 事件源:li
                        2. 事件类型:onclick
                        3. 事件处理
                        3.1 将li中的数据放到输入框中:txt.value = li.innerText
                        3.2 清空提示列表:ul.innerHTML = ''
                    */
                    // 1. 事件源:li
                    // 2. 事件类型:onclick
                    li.onclick = function () {
                        // 3. 事件处理
                        // 3.1 将li中的数据放到输入框中:txt.value = li.innerText
                        txt.value = li.innerText
                        // 3.2 清空提示列表:ul.innerHTML = ''
                        ul.innerHTML = '';
                    };
                };
            });
        };
        //  要求 用户任意输入一个不存在的关键字 点击search的时候就将数据保存起来 下次就有这个词条
        //    1给search绑定事件
        let search = document.getElementById('search');
        search.onclick = function () {
            // console.log(search);
            // 保存原来数据
            let z = txt.value;
            // console.log(z);
            z = z.trim();
            // 2获取用户输入的数据  :安全 (空格处理);
            if (z.length == 0) {
                return;
            };
            // 3判定原词条中是否存在一样的词条:数组。indexof(用户输入)==-1
            if (keywords.indexOf(z) == -1) {
                // 4 用户输入的数据存入数组中:数组。push(用户输入的)
                keywords.push(z);
            };
        };
    </script>
</body>
</html>
相关文章
|
JavaScript 小程序 数据库
云开发(微信-小程序)笔记(十二)---- 搜索
云开发(微信-小程序)笔记(十二)---- 搜索
99 0
|
JavaScript 前端开发
WebApi入门第二章(获取操作页面元素)
WebApi入门第二章(获取操作页面元素)
129 0
WebApi入门第二章(获取操作页面元素)
|
JavaScript 索引
WebApi入门第十二章(原生轮播图 )(完结)
WebApi入门第十二章(原生轮播图 )(完结)
136 0
WebApi入门第十二章(原生轮播图 )(完结)
|
前端开发 测试技术
接口测试平台代码实现番外:主页终焉-1
好了,不知不觉,该平台已经跨过了130章的教程,主要功能已经实现过半,一些同学也开始实际项目中使用起来,各种提出的改进建议 优化也都接踵而至,其中最多的就是主页,请求改版。
接口测试平台代码实现番外:主页终焉-1
|
存储 XML 移动开发
【重温基础】17.WebAPI介绍
【重温基础】17.WebAPI介绍
165 0
|
数据库 Windows
艾伟:基于.NET平台的Windows编程实战(三)—— 项目的创建及主界面的设计
第一步:创建一个新的Windows项目 打开VS2005,点击“文件”-->“新建”-->“项目”,在弹出的对话框里,在左边选择“Windows”,在右边选择“Windows应用程序”,并在下面的名称里输入“QuestionnaireSystem”,选择相应的保存位置后,点“确定”,如下图3-1所示:                                  图3-1  这样一个新的Windows项目就创建好了。
758 0
|
数据库 Windows
艾伟_转载:基于.NET平台的Windows编程实战(三)—— 项目的创建及主界面的设计
第一步:创建一个新的Windows项目 打开VS2005,点击“文件”-->“新建”-->“项目”,在弹出的对话框里,在左边选择“Windows”,在右边选择“Windows应用程序”,并在下面的名称里输入“QuestionnaireSystem”,选择相应的保存位置后,点“确定”,如下图3-1所示:                                  图3-1  这样一个新的Windows项目就创建好了。
830 0