问题:实现input搜索框实时检索的功能,类似哔哩哔哩首页搜索功能(壮哉我大b站!)。公司要求,emmmm没办法,果然懒人是要被赶着走才会进步的说,诶嘿O(∩_∩)O。

解决方法:

1.参考资料:http://www.jb51.net/article/111408.htm 基础思路

http://blog.sina.com.cn/s/blog_69ec42d50102wqok.html 进阶思路

2.效果图:

3.思路:

一:目前监听input输入框有三种方法:

一种是onchange事件,触发条件:内容改变且失去焦点。

一种是onpropertychange事件,触发条件:元素内容改变即触发,另外js改变内容,该元素的属性改变也会触发。但只在IE11以下支持。

一种是html5的oninput事件,触发条件:value值的改变,但是js方式改变value不会触发,且在IE8以上及其他标准浏览器支持。

二:采用最简单的html5的oninput事件,onchange事件触发条件无法达到理想的输入即检索,onpropertychange对浏览器的支持力度太低。

三:由于oninput事件是输入即触发,这会导致出现输入汉字时出发次数过多,即使在拼写的时候也会触发,影响用户体验和后台交互,所以利用compositionstart和compositionend来处理。

原理:

当浏览器有非直接的文字输入时,compositionstart事件就会同步触发,记住,是同步

当浏览器是直接的文字输入时,compositionend事件就会触发

所以:


  1. var cpLock = false;
  2. $('input[search]').on('compositionstart', function () {
  3. // 输入汉语拼音时锁住搜索框,不进行搜索,或者从汉语拼音转到字母时也可触发
  4. cpLock = true;
  5. console.log('不搜索')
  6. });
  7. $('input[search]').on('compositionend', function () {
  8. // 结束汉语拼音输入并生成汉字时,解锁搜索框,进行搜索
  9. cpLock = false;
  10. console.log('汉字搜索');
  11. // 接下去放ajax请求生成下拉框内容
  12. });
  13. $('input[search]').on('input', function () {
  14. if (!cpLock) {
  15. console.log('字母搜索')
  16. // 接下去放ajax请求生成下拉框内容
  17. }
  18. });

4.代码:(我知道大家都和我一样懒的,嗯~ o(* ̄▽ ̄*)o,不要脸地这么认为了,嘿嘿,下面代码是我稍微改了某大神的代码弄的demo,对不起大神,真的不是故意不加名字链接的,主要是开的页面太多关了不知道是哪个,加上自己懒)

demo:


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>模糊查询</title>
  6. <script src="../../../js/jquery-1.8.2.js"></script>
  7. <style>
  8. *{
  9. list-style: none;
  10. padding:0;
  11. margin:0;
  12. }
  13. div{
  14. text-align: center;
  15. padding-top:20px;
  16. }
  17. ul{
  18. padding-top:20px;
  19. width:30%;
  20. margin:0 50% 0 35%;
  21. }
  22. li{
  23. padding:3px;
  24. border:1px solid silver;
  25. box-shadow: 1px 1px;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div>
  31. <input type="text" id="txt">
  32. <button type="button" id="btn">search</button>
  33. <ul id="list">
  34. </ul>
  35. </div>
  36. <script>
  37. /**
  38. * Created by Steven on 2016-10-25.
  39. */
  40. var oTxt = document.getElementById('txt');
  41. var oBtn = document.getElementById('btn');
  42. var oList = document.getElementById('list');
  43. var fruits = ["桃子","苹果","梨子","香蕉","香瓜","葡萄","柠檬","橘子","草莓","草莓子","草拟吗","s","ssr"];
  44. //点击事件
  45. oBtn.addEventListener('click', function(){
  46. var keyWord = oTxt.value;
  47. // var fruitList = searchByIndexOf(keyWord,fruits);
  48. console.log(fruitList);
  49. var fruitList = searchByRegExp(keyWord, fruits);
  50. renderFruits(fruitList);
  51. }, false);
  52. //回车查询
  53. oTxt.addEventListener('keydown', function(e){
  54. if(e.keyCode == 13){
  55. var keyWord = oTxt.value;
  56. // var fruitList = searchByIndexOf(keyWord,fruits);
  57. var fruitList = searchByRegExp(keyWord, fruits);
  58. renderFruits(fruitList);
  59. }
  60. }, false);
  61. var cpLock = false;
  62. $('#txt').on('compositionstart', function () {
  63. cpLock = true;
  64. console.log("不搜索")
  65. });
  66. $('#txt').on('compositionend', function () {
  67. cpLock = false;
  68. console.log("汉字搜索");
  69. var keyWord = oTxt.value;
  70. // var fruitList = searchByIndexOf(keyWord,fruits);
  71. var fruitList = searchByRegExp(keyWord, fruits);
  72. renderFruits(fruitList);
  73. });
  74. $('#txt').on('input', function () {
  75. if (!cpLock) {
  76. console.log("字母搜索")
  77. var keyWord = oTxt.value;
  78. // var fruitList = searchByIndexOf(keyWord,fruits);
  79. var fruitList = searchByRegExp(keyWord, fruits);
  80. renderFruits(fruitList);
  81. }
  82. });
  83. function renderFruits(list){
  84. if(!(list instanceof Array)){
  85. return ;
  86. }
  87. oList.innerHTML = '';
  88. var len = list.length;
  89. var item = null;
  90. for(var i=0;i<len;i++){
  91. item = document.createElement('li');
  92. item.innerHTML = list[i];
  93. oList.appendChild(item);
  94. }
  95. }
  96. //模糊匹配的时候如果不区分大小写,可以使用toLowerCase()或者toUpperCase()转换之后去匹配。
  97. //模糊查询1:利用字符串的indexOf方法
  98. function searchByIndexOf(keyWord, list){
  99. if(!(list instanceof Array)){
  100. return ;
  101. }
  102. var len = list.length;
  103. var arr = [];
  104. for(var i=0;i<len;i++){
  105. //如果字符串中不包含目标字符会返回-1
  106. if(list[i].indexOf(keyWord)>=0){
  107. arr.push(list[i]);
  108. }
  109. }
  110. return arr;
  111. }
  112. //正则匹配
  113. function searchByRegExp(keyWord, list){
  114. if(!(list instanceof Array)){
  115. return ;
  116. }
  117. var len = list.length;
  118. var arr = [];
  119. var reg = new RegExp(keyWord);
  120. for(var i=0;i<len;i++){
  121. //如果字符串中不包含目标字符会返回-1
  122. if(list[i].match(reg)){
  123. arr.push(list[i]);
  124. }
  125. }
  126. return arr;
  127. }
  128. renderFruits(fruits);
  129. </script>
  130. </body>
  131. </html>

原文地址:https://blog.csdn.net/qq_39974331/article/details/80410032

input搜索框实时检索功能实现(超简单,核心原理请看思路即可)的更多相关文章

  1. JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件

    JS: document.getElementById("input对象的ID").addEventListener('input',function(){ console.log ...

  2. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  3. input搜索框的搜索功能

    如图,想要实现输入关键词,点击搜索按钮或者回车键都能进行搜索并返回. html部分代码如下: js部分—— function entersearch(){ var event = window.eve ...

  4. 【组件】微信小程序input搜索框的实现

    开发小程序的过程,是一个学习知识,解决问题的过程,每当实现了一个需求,总会有很大的成就感,每天记录一个开发过程中的细节.实现效果如下: 官方参考链接:https://developers.weixin ...

  5. input搜索框:根据历史记录自动填充后,去除默认黄色背景

    如果是纯色背景,直接通过box-shadow覆盖即可: input:-webkit-autofill { color: #333!important; -webkit-text-fill-color: ...

  6. element input搜索框探索

    转(https://blog.csdn.net/qq_37746973/article/details/78402812) 在script中添加下面两个函数 //queryString 为在框中输入的 ...

  7. 设计input搜索框提示文字点击消失的效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 微信小程序 —搜索框

    wxSearch优雅的微信小程序搜索框 一.功能 支持自定义热门key 支持搜索历史 支持搜索建议 支持搜索历史(记录)缓存 二.使用 1.将wxSearch文件夹整个拷贝到根目录下 2.引入 // ...

  9. 通过cookie实现搜索框内容保存关闭浏览器之前的操作、jq js实现方法

    jq实现的方法: jq需要在页面中引入JQ.cookie插件 这是一个超轻量级插件 要实现的效果: 下面是jq代码: $(function(){ var til=$("#orderInfoC ...

随机推荐

  1. FLASH和EEPROM的区别

    FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低 ...

  2. week5 作业

    week5 作业 1.描述GPT是什么,应该怎么使用? 描述GPT之前要简单了解MBR分区,MBR(Main Boot Record)叫做主引导记录,其位于磁盘的最前端,由一段代码组成,共占用512个 ...

  3. ubuntu16.04和vim的配置与美化

    目录 ubuntu16.04配置 ubuntu16.04 美化 vim配置 vim美化 ubuntu16.04配置 安装vim sudo apt-get install vim-gnome 换源 su ...

  4. PTA 刷题与Z老师的头发

    刷题与Z老师的头发 (10 分) 在Pintia上,每天Z老师出题.小盆友们刷题.Z老师的头发遵从以下规律: 1.每天生长出60根头发: 2.每出一道题,减少20根头发: 3.每天结束时统计累积做题情 ...

  5. LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)

    题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...

  6. openssl-1.0.1u静态库编译

    不管Windows还是linux都是需要安装好perl环境的 Windows步骤 1.解压openssl-1.0.1u.tar.gz 2.使用Vs2005命令行工具进入解压后的目录 3.执行如下命令 ...

  7. 关于Oracle报表

    1.存储过程中的WHEN OTHERS THEN是什么意思. 异常分很多种类,如NO_FOUND.OTHERS处本应该写异常名称,如果不想把异常分得那么细,可以笼统一点用OTHERS来捕获,即所有异常 ...

  8. committed与urgent的区别

    Committed跟Urgent都是time automaton 中用来表示state的关键词. 它们的主要区别是: Committed前后的两个状态改变(transition)是串行发生,不可打断的 ...

  9. SparseLDA算法

    2 SparseLDA算法 本章将介绍一种Gibbs Sampling算法的加速算法——SparseLDA [9],它主要利用LDA 模型的稀疏性,来达到加速以及节省内存的目的,是一种精确算法(没有近 ...

  10. CoverflowJS

    coverflow是苹果首创的将多首歌曲的封面以3D界面的形式显示出来的方式 GitHub地址:[https://github.com/coverflowjs/coverflow] 下载地址:[htt ...