JavaScript根據Json數據來做的模糊查詢功能
類似於百度搜索框的模糊查找功能
需要有有已知數據,實現搜索框輸入字符,然後Js進行匹配,然後可以通過鼠標點擊顯示的內容,把內容顯示在搜索框中
當然了,正則只是很簡單的字符匹配,不具備多麽復雜的判斷
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模糊查詢</title> <style> *{ list-style: none; padding:0; margin:0; } div{ text-align: center; padding-top:20px; } ul{ padding-top:20px; width:30%; margin:0 50% 0 35%; } li{ padding:3px; border:1px solid silver; box-shadow: 1px 1px; } </style> </head> <body> <div> <input type="text" id="txt"> <button type="button" id="btn">search</button> <ul id="list"> </ul> </div> <script> var oTxt= document.getElementById(‘txt‘); var oBtn = document.getElementById(‘btn‘); var oList = document.getElementById(‘list‘); // var newJson = ["桃子", "蘋果", "梨子", "香蕉", "香瓜", "葡萄", "檸檬", "橘子", "草莓"]; var newJson= ["桃子", "蘋果", "梨子", "香蕉", "香瓜", "葡萄", "檸檬", "橘子", "草莓"]; //點擊事件 oTxt.addEventListener(‘keyup‘, function () { checkCharacter(); var keyWord = oTxt.value; // var fruitList = searchByIndexOf(keyWord,newJson); // console.log(fruitList); var fruitList = searchByRegExp(keyWord, newJson); renderFruits(fruitList); showClickDiv(); }, false); //回車查詢 oTxt.addEventListener(‘keydown‘, function (e) { if (e.keyCode == 13) { var keyWord = oTxt.value; // var fruitList = searchByIndexOf(keyWord,newJson); var fruitList = searchByRegExp(keyWord, newJson); renderFruits(fruitList); } }, false); function showClickDiv() { var liList = oList.getElementsByTagName("li"); console.log(liList); for (var i = 0; i < liList.length; i++) { liList[i].onclick = function () { console.log(this.innerHTML); showClickTextFunction(this.innerHTML); } } } function checkCharacter() { var etest = oTxt.value; if (etest == ‘‘ || etest == ‘null‘ || etest == undefined) { oList.style.display = "none"; return false; } else { oList.style.display = "block"; } } function renderFruits(list) { if (!(list instanceof Array)) { return; } oList.innerHTML = ‘‘; var len = list.length; var item = null; for (var i = 0; i < len; i++) { item = document.createElement(‘li‘); item.innerHTML = list[i]; oList.appendChild(item); } } //模糊查詢1:利用字符串的indexOf方法 function searchByIndexOf(keyWord, list) { if (!(list instanceof Array)) { return; } var len = list.length; var arr = []; for (var i = 0; i < len; i++) { //如果字符串中不包含目標字符會返回-1 if (list[i].indexOf(keyWord) >= 0) { arr.push(list[i]); } } return arr; } //正則匹配 //keyword是輸入的值,list是存儲數據的數組 function searchByRegExp(keyWord, list) { if (!(list instanceof Array)) { return; } var len = list.length; var arr = []; var reg = new RegExp(keyWord); for (var i = 0; i < len; i++) { //如果字符串中不包含目標字符會返回-1 if (list[i].match(reg)) { arr.push(list[i]); } } return arr; } // renderFruits(newJson); //選中後處理數據 var showClickTextFunction = function (a) { //alert(this.innerText + "---" + this.getAttribute("code")); oTxt.value = a; // $(‘#ruleOrgCode‘).val(this.getAttribute("code")); oList.style.display = "none"; console.log(oTxt.value); }; </script> </body> </html>
根據這個簡單功能的實現,可以進行一些更加復雜的操作
我現在做的一個模糊查詢是根據返回的Json數據來和後臺的數據進行匹配
當你輸入的值得不到匹配的時候,出現的模糊搜索框會消失
具體思路如下
由於是在當前頁面內所有的input標簽內
所以
1.先獲取所有頁面的內input標簽
2.設定一個全局變量用來存儲對應Json內的數據
3.通過for循環遍歷所有的input標簽
3.1每個input標簽觸發onclick事件
3.1.1找到當前被點擊input標簽的id(當前id存儲的是Json數據內的鍵名)
3.1.2設置兩個全局變量用來存儲Json樹當前節點和父級節點
3.1.3通過getNode方法(這個方法之前的隨筆裏有)找到當前節點和父級節點
3.1.4把當前節點下被模糊查詢的數據,也就是一個數組放到第2步設定的全局變量中
3.2每個input標簽 觸發keyup事件
3.2.1設定一個局部變量,用來存儲一個返回值;通過創建ul層的方法得到一個返回值確定是否繼續往下執行(ul層用來存儲對應的數據)
3.2.2通過if(返回值),當為真,則繼續執行
3.2.3設定一個局部變量獲得新創建的ul層的Dom節點,然後給ul層設定樣式,比如定位,寬,背景色等等
3.2.4設定一個局部變量用來獲得input標簽輸入的值
3.2.5通過方法獲取匹配到的電話號碼,返回的是一個數組
3.2.6通過方法輸入為空或者匹配到的號碼為空則刪除電話號碼ul層
3.2.7通過方法把電話號碼寫在li層,然後添加到ul中
3.2.8顯示被鼠標點擊的電話號碼
主要JavaScript代碼如下:
fuzzy_Search: function () { //先找到對應的屬性,然後才能繼續執行 var newJson = this.jsonB.ModuleList; //先確定所有的input標簽 var inputLabel = document.getElementsByClassName("wrap")[0].getElementsByTagName("input"); //存儲當前input的下電話號碼的數據 var currentData; //遍歷所有的input for (var i = 0; i < inputLabel.length; i++) { inputLabel[i].onclick = function () { //找到了當前被點擊input標簽的id var backLabel = show_element(event); console.log(backLabel); //設置Json樹當前節點的變量名 node = null; //設置Json樹父級節點的變量名 parentNode = null; //根據獲取的id名查找所在當前節點以及父節點的方法 var obj = getNode(newJson, backLabel); console.log(obj);; //typeData為被查詢數據所在數組對應的鍵名 currentData = obj.node.TypeData; } inputLabel[i].addEventListener(‘keyup‘, function () { //創建ul層的函數,通過返回值確定是否繼續往下執行 var flag = createSearchUl(currentData, this); if (flag) { //獲取創建好的ul層的DOM節點 var oList = document.getElementById("createUl"); //設置ul層的屬性 oList.setAttribute(‘style‘, ‘position: absolute;left:180px;top:50px;z-index:100;background:#fff;list-style:none;width:71%;cursor:pointer‘); console.log("找到了Ul", oList); //在input標簽中獲取輸入的值 var keyWord = this.value; //通過searchByRegExp方法獲取匹配到的電話號碼,返回的是一個數組 var dataList = searchByRegExp(keyWord, currentData); //輸入為空或者匹配到的號碼為空則刪除電話號碼ul層 checkCharacter(this, oList, dataList); //把電話號碼寫在li層,然後添加到ul中 renderData(dataList, oList); //顯示被鼠標點擊的電話號碼 showClickDiv(oList, this); } }, false); } //創建一個ul,然後在input標簽對應的父級中添加入ul function createSearchUl(CrData, thisLabel) { if (CrData.length > 0) { if (!(thisLabel.value == ‘‘ || thisLabel.value == ‘null‘ || thisLabel.value == undefined)) { //找到input標簽的父級 var searchDiv = thisLabel.parentNode; //給他的父級做一個相對定位 searchDiv.setAttribute(‘style‘, ‘position: relative‘); //建立一個裝電話號碼的ul var iUl = document.createElement("ul"); //把ul添加到父級中 searchDiv.appendChild(iUl); //給ul建立一個id searchDiv.getElementsByTagName("ul")[0].setAttribute(‘id‘, ‘createUl‘); return true; } else { var UlS = thisLabel.parentNode.getElementsByTagName("ul"); //console.log("當前input標簽的父級",thisInput.parentNode); for (var i = UlS.length - 1; i >= 0; i--) { UlS[0].parentNode.removeChild(UlS[i]); } return false; } } } //找到被點擊元素id的方法 function show_element(e) { if (!e) { var e = window.event; } //獲取事件點擊元素 var targ = e.target; //獲取元素名稱 var tname = targ.id; return tname; } //根據獲取的id名查找所在當前節點以及父節點 function getNode(json, nodeId) { //1.第一層 root 深度遍歷整個JSON for (var i = 0; i < json.length; i++) { console.log(json[i].Content); for (var j = 0; j < json[i].Content.length; j++) { if (node) { break; } var obj = json[i].Content[j]; //沒有就下一個 if (!obj || !obj.FieldName) { continue; } //2.有節點就開始找,一直遞歸下去 if (obj.FieldName == nodeId) { //找到了與nodeId匹配的節點,結束遞歸 node = obj; break; } else { //3.如果有子節點就開始找 if (obj.TypeData1) { //4.遞歸前,記錄當前節點,作為parent 父親 parentNode = obj; //遞歸往下找 getNode(obj.TypeData1, nodeId); } else { //跳出當前遞歸,返回上層遞歸 continue; } } } } //5.如果木有找到父節點,置為null,因為沒有父親 if (!node) { parentNode = null; } //6.返回結果obj return { //父級節點 parentNode: parentNode, //當前節點 node: node }; } //顯示被鼠標點擊的電話號碼 function showClickDiv(oList,thisInput) { var liList = oList.getElementsByTagName("li"); console.log(liList); for (var i = 0; i < liList.length; i++) { liList[i].onclick = function () { console.log(this.innerHTML); //三個實參;1.當前li標簽內的內容,2.輸入的值;3.當前的ul層 showClickTextFunction(this.innerHTML, thisInput, oList); } } } //輸入為空或者匹配到的號碼為空則刪除電話號碼ul層 function checkCharacter(thisInput, oList, dataList) { //獲取input標簽輸入的值 var etest = thisInput.value; //為空則刪除創建的ul層 if (etest == ‘‘ || etest == ‘null‘ || etest == undefined) { oList.parentNode.removeChild(oList); return false; }//當再次匹配號碼為空,則刪除所有的ul層 else if (dataList <= 0) { var UlS = thisInput.parentNode.getElementsByTagName("ul"); //console.log("當前input標簽的父級",thisInput.parentNode); for (var i = UlS.length-1; i >= 0; i--) { oList.parentNode.removeChild(UlS[i]); } } } //把電話號碼寫在li層,然後添加到ul中 function renderData(list, oList) { //傳進來的list不是數組,就跳出該方法 if (!(list instanceof Array)) { return; } //設置ul的內容為空 oList.innerHTML = ‘‘; //獲取存電話號碼數組的長度 var len = list.length; //定義一個變量用來創建li標簽 var item = null; //for循環遍歷存電話號碼的數組,把號碼寫入創建的li標簽中,再添加到ul中 for (var i = 0; i < len; i++) { item = document.createElement(‘li‘); //為創建的li標簽添加class item.setAttribute("class", "newLi"+i); item.innerHTML = list[i]; oList.appendChild(item); } } //正則匹配 //keyword是輸入的值,list是存儲數據的數組 function searchByRegExp(keyWord, list) { if (!(list instanceof Array)) { return; } var len = list.length; var arr = []; var reg = new RegExp(keyWord); for (var i = 0; i < len; i++) { //匹配到一個電話號碼就存入數組中 if (list[i].phone.match(reg)) { arr.push(list[i].phone); } } return arr; } //選中後處理數據 function showClickTextFunction(a, b, oList) { b.value = a; oList.style.display = "none"; } }
JavaScript根據Json數據來做的模糊查詢功能