• 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
  • 相关阅读:
    Dapper的基本使用
    Dapper
    Dapper(一) 简介和性能
    Dapper入门使用,代替你的DbSQLhelper
    Dapper-小型ORM之王(C#.NET)
    Dos.Common
    Dos.ORM(原Hxj.Data)- 目录、介绍
    读写分离
    什么是长连接,什么是短连接?长连接和短连接的区别是什么?
    HTTP的长连接和短连接
  • 原文地址:https://www.cnblogs.com/jpfss/p/11642162.html
Copyright © 2020-2023  润新知