上来先展示效果:
默认展示效果:

输入内容:

上代码:

css部分:

  1. <style type="text/css">
  2. * {
  3. padding:;
  4. margin:;
  5. }
  6. h2 {
  7. margin-bottom: 20px;
  8. }
  9. #container {
  10. width: 500px;
  11. text-align: center;
  12. margin: 0 auto;
  13. font-family: "微软雅黑";
  14. margin-top: 50px;
  15. }
  16. .selectContainer {
  17. position: relative;
  18. }
  19. .selectInput {
  20. width: 200px;
  21. height: 25px;
  22. border-style: none;
  23. border: 1px solid #999;
  24. border-radius: 3px;
  25. padding: 0 3px;
  26. }
  27. .picture_click {
  28. background: url(img/select-default.png) no-repeat;
  29. opacity:;
  30. width: 15px;
  31. height: 8px;
  32. position: absolute;
  33. top: 10px;
  34. right: 125px;
  35. }
  36. .picture_click:hover {
  37. background-image: url(img/select-hover.png);
  38. }
  39. .selectList {
  40. width: 206px;
  41. height: 212px;
  42. overflow-y: scroll;
  43. text-align: left;
  44. margin: 0 172px;
  45. border: 1px solid #999;
  46. display: none;
  47. position: relative;
  48. }
  49. .selectList div {
  50. cursor: pointer;
  51. }
  52. .nullcon{
  53. display: none;
  54. text-align: center;
  55. padding: 10px;
  56. word-break: break-all;
  57. }
  58. </style>

html部分:

  1. <div id="container">
  2. <h2>模糊搜索</h2>
  3. <div id="cityContainer" class="selectContainer">
  4. <label>公司:</label>
  5. <input type="text" placeholder="请输入公司名称" list="cityList" class="selectInput" name="cityName" id="cityName" value="" onfocus="fuzzySearch.call(this, 'cityList')" />
  6. <div class="picture_click dropDowns" style=""></div>
  7. <div id="cityList" class="selectList">
  8.  
  9. </div>
  10. </div>
  11. </div>

js部分:

  1. <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
  2. <script type="text/javascript">
  3.  
  4. function fuzzySearch(listId) {
  5. var that = this;
  6. //初始化下拉框
  7. initSearchInput(that, listId);
  8. var listArr = [
  9. {'eleId':'01',eleName:'测试公司'},
  10. {'eleId':'02',eleName:'出纳测试公司1'},
  11. {'eleId':'03',eleName:'期间设置公司'},
  12. {'eleId':'04',eleName:'演示公式'},
  13. {'eleId':'05',eleName:'公司11'},
  14. {'eleId':'06',eleName:'HFY测试公司'},
  15. {'eleId':'07',eleName:'测试公司2'},
  16. {'eleId':'08',eleName:'中餐饮有限公司'},
  17. {'eleId':'09',eleName:'烤匠烤鱼餐厅'},
  18. {'eleId':'10',eleName:'呷哺呷哺北京1'},
  19. {'eleId':'11',eleName:'呷哺呷哺北京2店'},
  20. {'eleId':'12',eleName:'呷哺呷哺北京3店'},
  21. {'eleId':'13',eleName:'肯德基'},
  22. {'eleId':'14',eleName:'麦当劳'},
  23. {'eleId':'15',eleName:'必胜客'},
  24. {'eleId':'16',eleName:'麦当劳222'}
  25. ]
  26.  
  27. var aa=$('#' + listId);
  28.  
  29. //遍历数组,创建元素默认显示
  30. $('#' + listId).html('');
  31. $.each(listArr, function(index, item){
  32. var divStr = '<div id='+item.eleId+'>'+item.eleName+'</div>';
  33. $('#' + listId).append(divStr);
  34. })
  35. $('#' + listId).append('<div id="nullcon" class="nullcon">没有找到内容</div>');
  36.  
  37. //current用来记录当前元素的索引值
  38. var current = 0;
  39. //匹配文本框中输入的字符串
  40. var showList = searchText(that, listArr, listId);
  41.  
  42. bindFun();
  43.  
  44. //为文本框绑定键盘引起事件
  45. $(this).keyup(function(e){
  46. //如果输入空格自动删除
  47. this.value=this.value.replace(' ','');
  48. //列表框显示
  49. $('#' + listId).show();
  50. if(e.keyCode == 38) {
  51. //up
  52. console.log('up');
  53. current --;
  54. if(current <= 0) {
  55. current = 0;
  56. }
  57. console.log(current);
  58. }else if(e.keyCode == 40) {
  59. //down
  60. console.log('down');
  61. current ++;
  62. if(current >= showList.length) {
  63. current = showList.length -1;
  64. }
  65. console.log(current);
  66.  
  67. }else if(e.keyCode == 13) {
  68. //enter
  69. console.log('enter');
  70. //如果按下回车,将此列表项的内容填充到文本框中
  71. $(that).val(showList[current].eleName);
  72. //下拉框隐藏
  73. $('#' + listId).hide();
  74. }else {
  75. //other
  76. console.log('other');
  77. showList = searchText(that, listArr, listId);
  78. current = 0;
  79. }
  80.  
  81. //设置当前项的背景色及位置
  82. if(showList && showList.length!=0){
  83. $.each(showList, function(index, item){
  84. if(index == current) {
  85. $('#' + item.eleId).css('background', '#eee');
  86. $('#' + listId).scrollTop($('#' + item.eleId).get(0).offsetTop);
  87. }else {
  88. $('#' + item.eleId).css('background', '');
  89. }
  90. })
  91. }
  92. //设置下拉框的高度
  93. //212为列表框的最大高度
  94. if(showList && showList.length!=0){
  95. if(212 > $('#' + listId).find('div').eq(0).height() * showList.length) {
  96. $('#' + listId).height($('#' + listId).find('div').eq(0).height() * showList.length);
  97. }else {
  98. $('#' + listId).height(212);
  99. }
  100. }
  101. })
  102. }
  103.  
  104. //绑定事件
  105. function bindFun(){
  106. //给下拉箭头绑定点击事件 点击下拉箭头显示/隐藏对应的列表
  107. //输入框的类名为selectInput
  108. //下拉箭头的类名为picture_click、dropDowns
  109. //下拉列表的类名为selectList
  110. for(var i = 0; i < $('.picture_click').length; i++) {
  111. $('.picture_click').eq(i).click(function(){
  112. $(this).parent().find('.selectList').toggle();
  113. })
  114. }
  115.  
  116. //为列表中的每一项绑定鼠标经过事件
  117. $('.selectList div').mouseenter(function(){
  118. $(this).css("background", "#eee").siblings().css("background", "");
  119. });
  120. //为列表中的每一项绑定单击事件
  121. $('.selectList div').bind('click', function(){
  122. //文本框为选中项的值
  123. $(this).parent().parent().find('.selectInput').val($(this).html());
  124. //下拉框隐藏
  125. $(this).parent().hide();
  126. });
  127. }
  128.  
  129. function initSearchInput(that, listId) {
  130.  
  131. //点击下拉框外部的时候使下拉框隐藏
  132. var dropDowns = document.getElementsByClassName('dropDowns');
  133. var selectList = document.getElementsByClassName('selectList');
  134.  
  135. document.body.onclick = function(e){
  136. e = e || window.event;
  137. var target = e.target || e.srcElement;
  138. console.info('target', target);
  139. console.info('that', that);
  140. console.info('===', target == that)
  141. if(target == that){
  142. $('#' + listId).show();
  143. }else{
  144. for(var i = 0; i < dropDowns.length; i++) {
  145. if(target != dropDowns[i] && target != selectList[i]){
  146. selectList[i].style.display = 'none';
  147. }
  148. }
  149. }
  150.  
  151. }
  152. }
  153.  
  154. function searchText(that, listArr, listId){
  155. //文本框中输入的字符串
  156. var searchVal = $(that).val();
  157. var showList = [];
  158. if(showList.length== 0 && !$(that).val()){
  159. //showList为列表中和所输入的字符串匹配的项
  160. showList = listArr;
  161. }
  162.  
  163. if(searchVal){
  164. //将和所输入的字符串匹配的项存入showList
  165. //将匹配项显示,不匹配项隐藏
  166. $.each(listArr, function(index, item){
  167. if(item.eleName.indexOf(searchVal) != -1) {
  168. $('#' + item.eleId).css('display', 'block');
  169. showList.push(item);
  170. }else {
  171. $('#' + item.eleId).css('display', 'none');
  172. }
  173. })
  174. }else{
  175. showList = listArr;
  176. $.each(listArr, function(index, item){
  177. $('#' + item.eleId).css('display', 'block');
  178. })
  179. $(that).siblings('.selectList').find('#nullcon').hide();
  180. }
  181.  
  182. if(showList.length== 0 && $(that).val()){
  183. $('#' + listId).height(50);
  184. $(that).siblings('.selectList').find('#nullcon').html('没有找到"'+$(that).val()+'"的内容').show();
  185. }
  186.  
  187. console.log('showList', showList);
  188.  
  189. return showList;
  190. }
  191. </script>

超好用的input模糊搜索 jq模糊搜索,的更多相关文章

  1. layui select配合input实现动态模糊搜索

    功能需求:select框可以自己输入,就是在下拉列表里找不到自己想要的选项就可以自己输入,同时还要支持模糊匹配功能 html代码: 样式: <style> .select-search-i ...

  2. 整理版jq 复习贴子

    1绝对定位(abs)与相对定位(relative) 区别是相对定位参照自己的位置进行移动(当然需要设置top left这些生效)并且原来的位置保留着 偏移后会把 其它的层遮罩住 绝对定位就是的参照位置 ...

  3. jq处理JSON数据, jq Manual (development version)

    jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...

  4. 49.CSS--- 特殊css3效果展示

    1.设置多行文本超出显示省略号<div class="caption"> <p>显示超过两行就显示省略号,其余隐藏,隐藏不了的情况下给这个模块添加一个高度和 ...

  5. (转)倾力总结40条常见的移动端Web页面问题解决方案

    原文链接:戳这里 1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太 ...

  6. 【转】40条常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊                  2.图片加载                            3.假如手机网站不用兼容IE浏览器,一般我们会使用zep ...

  7. 移动端Web页面问题(转载)

    1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...

  8. 倾力总结40条常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...

  9. 1.7.4 Query Syntax and Parsing

    1. 查询语法和解析 这部分主要说明了如何指定被使用的查询解析器.同样描述了主查询解析器的支持的语法和功能.同时还描述了在特定环境下使用的其他查询解析器.这里有一些普通查询解析器都能使用的参数,将会在 ...

随机推荐

  1. leetcode 234 回文链表 Palindrome Linked List

    要求用O(n)时间,和O(1)空间,因此思路是用本身链表进行判断,既然考虑回文,本方法思想是先遍历一次求链表长度,然后翻转前半部分链表:然后同时对前半部分链表和后半部分链表遍历,来判断对应节点的值是否 ...

  2. Spring MVC集成Swagger2.0

    在集成Swagger之前,得先说说什么是Swagger,它是用来做什么的,然后再讲讲怎么集成,怎么使用,当然,在这之前,需要了解一下OpenAPI. OpenAPI OpenAPI 3.0规范定义了一 ...

  3. node.js中的 compression 中间件

    NodeJs——express启用gzip gzip是用于压缩,js.css等文件的压缩 具体方法如下: 先安装一个依赖 npm install compression --save 在项目的 app ...

  4. Javascript实现的图片隐写术

    javascript图片隐写术,感觉可以用它来干点有想法的事情   1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人 ...

  5. mybatis使用map传递多参数报错:A query was run and no Result Maps were found for the Mapped Statement

    在使用mybatis进行多参数传递时,报错: A query was run and no Result Maps were found for the Mapped Statement 'xx.xx ...

  6. spring-第N篇整合SSM,即Mybatis+Spring+Spring MVC

    1.Mybatis的配置使用 1>Jar包:mybatis-3.4.5.jar.mysql-connector-6.0.2或者ojdbc6-11.2.0.4.jar. 2>编写conf.x ...

  7. W同学的新画板 QDUOJ 线段树 区间颜色段数

    W同学的新画板 QDUOJ 线段树 区间颜色段数 原题链接 题意 W同学在每天的刻苦学习完成功课之余,都会去找一些有趣的事情来放松自己:恰巧今天他收到了朋友送给他的一套画板,于是他立刻拆开了包装,拿出 ...

  8. 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)

    转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...

  9. python列表的复制,扯一下浅拷贝与深拷贝的区别

    将一个列表的数据复制到另一个列表中.使用列表[:],可以调用copy模块 import copy A = [21,22,23,24,['a','b','c','d'],25,26] B = A #直接 ...

  10. 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...