需求:
需求1:用户输入关键字,我们想办法获取到用户输入的关键字,然后去“服务器”数组匹配:匹配成功,将词条显示在输入框下面
需求2:鼠标移入变色,移出变回去
需求3:点击li,将li的数据放到输入框中,不再提示
需求4: 用户任意输入一个不存在的关键字 点击search的时候就将数据保存起来 下次就有这个词条
服务器数据:
["海海","海海有女朋友吗", "海海是谁", "广东人", "广东人爱吃", "广东人爱吃什么", "广东人什么都吃", "小米", "小米雷军", "小米手机", "", "小米回应收购恒大", "阿里", "阿里跌8200亿元成最大输家","苹果", "苹果乔布斯", "苹果以15.8万亿价值蝉联", "苹果一块一斤", "苹果笔记本"];
效果图
用户输入关键字就会弹出弹框
基本样式
<!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>