zoukankan      html  css  js  c++  java
  • input搜索框实时检索功能实现(超简单,核心原理请看思路即可)

    问题:实现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
  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/jpfss/p/11642162.html
Copyright © 2011-2022 走看看