js实现带搜索功能的下拉框


Posted in Javascript onJanuary 11, 2020

本文实例为大家分享了js实现带搜索功能的下拉框,供大家参考,具体内容如下

1、介绍

在实现下拉框的时候,如果用select+option可以在满足pc端的需求,但如果需应用到手机端,由于select的样式太丑。所以接下来利用div+p实现到输入文本的下拉框

2、思路

1 利用一个input充当搜索框,div+p充当下拉框放置于input的下方。如图所示:

js实现带搜索功能的下拉框

2 接下来就是js的实现了,我们先把红色区域的div+p利用display:none隐藏起来。
对表单input添加onfocus事件,当input获取焦点的时候获取显示红色区域。
在对表单添加oninput事件,根据input的字段筛选出有关的p标签即可

3 对红色区域的div设置点击事件,利用事件委托将点击的p标签的值赋值到input上即可。

3、代码

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>
<style>
 *{
  margin: 0;
  padding: 0;
 }
 .search{
  border: 1px solid transparent;
  width: 400px;
  height: 80px;
  margin: 0 auto;
 }
 .search input{
  border: 1px solid gray;
  width: 200px;
  height: 80px;
 }
 .content{
  width: 200px;
 /* height: 80px; */
  border: 1px solid red;
  overflow-y: auto;
  max-height: 60px;
 }
 .content p {
  height: 20px;
 }
</style>
<body onload="onload()">
 <div class="search">
  <input id="input" type="text" placeholder="请输入" onfocus="showDiv()" oninput="filterP()">
  <div id="dataList" class="content" onclick="pushInput()" style="display:none;">
   <p>123</p>
   <p>159</p>
   <p>147</p>
   <p>163</p>
  </div>
 </div>
 <script>
  var dataArr = [];
  var dataList = document.getElementById('dataList');
  function onload() { //初始化dataArr的数据
   var childs = dataList.children; //在IE下注释也算节点,不能用于
   for (var i = 0; i < childs.length; i++) {
    dataArr.push(childs[i].innerText);
   }
   console.log(dataArr);
  }
  function showDiv() {
   dataList.style.display = "";
  }
  function filterP() {
   var e = event.target || event.srcElement;
   var str = e.value;
   console.log(str);
   dataList.innerHTML = ''; //清空div下的所有P元素
   dataArr.forEach(function (item) {
    if (item.indexOf(str) != -1) {
     var p = document.createElement('p');
     var text = document.createTextNode(item);
     p.appendChild(text);
     dataList.appendChild(p);
    }
   })
   console.log("dataList.innerHTML:" + dataList.innerHTML)
   if (dataList.innerHTML == '') {
    var p = document.createElement('p');
    var text = document.createTextNode('暂无数据');
    p.style.color = '#d7d7d7';
    p.onclick = function () { event.stopImmediatePropagation(); } //阻止事件的冒泡
    p.appendChild(text);
    dataList.appendChild(p);
   }
  }
  function pushInput() { //利用事件委托机制,获取点击的P源
   var e = event.target || event.srcElement;
   var input = document.getElementById('input');
   input.value = e.innerText;
   dataList.style.display = 'none';
  }
/**
 stopImmediatePropagation() 和 stopPropagation()的区别在哪儿呢?
后者只会阻止冒泡或者是捕获。 但是前者除此之外还会阻止该元素的其他事件发生,但是后者就不会阻止其他事件的发生
 **/
 </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 全选效果实现代码
Mar 23 Javascript
Prototype Selector对象学习
Jul 23 Javascript
10个基于浏览器的JavaScript调试工具分享
Feb 07 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
Javascript设计模式之观察者模式(推荐)
Mar 29 Javascript
原生js制作日历控件实例分享
Apr 06 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
Vue2.0组件间数据传递示例
Mar 07 Javascript
js实现股票实时刷新数据案例
May 14 Javascript
浅谈vue路径优化之resolve
Oct 13 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
vue中是怎样监听数组变化的
Oct 24 Javascript
js实现select下拉框选择
Jan 11 #Javascript
js实现二级联动简单实例
Jan 11 #Javascript
jQuery实现轮播图效果demo
Jan 11 #jQuery
详解微信小程序中var、let、const用法与区别
Jan 11 #Javascript
jQuery擦除插件eraser使用方法详解
Jan 11 #jQuery
详解javascript中var与ES6规范中let、const区别与用法
Jan 11 #Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 #jQuery
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
JS替换字符串中空格方法
2015/04/17 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
JS实现多功能计算器
2020/10/28 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
numpy.where() 用法详解
2019/05/27 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
如何写出好的Java代码
2014/04/25 面试题
大学生简历的个人自我评价
2013/12/04 职场文书
公司晚会主持词
2014/03/22 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
先进单位申报材料
2014/12/25 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS