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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM