码迷,mamicode.com
首页 > Web开发 > 详细

点滴积累【JS】---JS实现仿百度模糊搜索效果

时间:2016-08-14 23:59:23      阅读:623      评论:0      收藏:0      [点我收藏+]

标签:

效果:技术分享

HTML代码:

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="InputText.aspx.cs" Inherits="DropDownLikeBaiDu.InputText" %>
 2 
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5 <head runat="server">
 6     <title></title>
 7     <script src="input.js" type="text/javascript"></script>
 8 </head>
 9 <body style=" background-color:green">
10     <form id="form1" runat="server">
11     <div style="margin-left: 300px; margin-top: 300px;">
12         青苹果搜索:
13         <input type="text" id="SearchID" onfocus="javascript:if(this.value==‘请输入内容‘)this.value=‘‘;"
14             onkeyup="autoComplete.start(event)" onblur="javascript:if(this.value==‘‘)this.value=‘请输入内容‘;" />
15         <div class="auto_hidden" style="margin-left:100px; background-color:white" id="SearchLike">
16             <!--自动完成 DIV-->
17         </div>
18     </div>
19     </form>
20 </body>
21 <script>
22     var get_ID = document.getElementById("SearchID");
23     var get_Like = document.getElementById("SearchLike");
24     var autoComplete = new AutoComplete(get_ID, get_Like, [中国, 中南海, 青苹果, 青菜, 青茶, 博客园, 博士, 博大精深]);
25 </script>
26 </html>

JS代码:

  1 var Bind = function (object, fun) {
  2     return function () {
  3         return fun.apply(object, arguments);
  4     }
  5 }
  6 function AutoComplete(obj, autoObj, arr) {
  7     this.obj = obj;        //输入框
  8     this.autoObj = autoObj; //DIV的根节点
  9     this.value_arr = arr;        //不要包含重复值
 10     this.index = -1;          //当前选中的DIV的索引
 11     this.search_value = "";   //保存当前搜索的字符
 12 }
 13 AutoComplete.prototype = {
 14     //初始化DIV的位置
 15     init: function () {
 16         this.autoObj.style.left = this.obj.offsetLeft + "px";
 17         this.autoObj.style.top = this.obj.offsetTop + this.obj.offsetHeight + "px";
 18         this.autoObj.style.width = this.obj.offsetWidth - 2 + "px"; //减去边框的长度2px   
 19     },
 20     //删除自动完成需要的所有DIV
 21     deleteDIV: function () {
 22         while (this.autoObj.hasChildNodes()) {
 23             this.autoObj.removeChild(this.autoObj.firstChild);
 24         }
 25         this.autoObj.className = "auto_hidden";
 26     },
 27     //设置值
 28     setValue: function (_this) {
 29         return function () {
 30             _this.obj.value = this.seq;
 31             _this.autoObj.className = "auto_hidden";
 32         }
 33     },
 34     //模拟鼠标移动至DIV时,DIV高亮
 35     autoOnmouseover: function (_this, _div_index) {
 36         return function () {
 37             _this.index = _div_index;
 38             var length = _this.autoObj.children.length;
 39             for (var j = 0; j < length; j++) {
 40                 if (j != _this.index) {
 41                     _this.autoObj.childNodes[j].className = ‘auto_onmouseout‘;
 42                 } else {
 43                     _this.autoObj.childNodes[j].className = ‘auto_onmouseover‘;
 44                 }
 45             }
 46         }
 47     },
 48     //更改classname
 49     changeClassname: function (length) {
 50         for (var i = 0; i < length; i++) {
 51             if (i != this.index) {
 52                 this.autoObj.childNodes[i].className = ‘auto_onmouseout‘;
 53             } else {
 54                 this.autoObj.childNodes[i].className = ‘auto_onmouseover‘;
 55                 this.obj.value = this.autoObj.childNodes[i].seq;
 56             }
 57         }
 58     },
 59     //响应键盘
 60     pressKey: function (event) {
 61         var length = this.autoObj.children.length;
 62         //光标键"↓"
 63         if (event.keyCode == 40) {
 64             ++this.index;
 65             if (this.index > length) {
 66                 this.index = 0;
 67             } else if (this.index == length) {
 68                 this.obj.value = this.search_value;
 69             }
 70             this.changeClassname(length);
 71         }
 72         //光标键"↑"
 73         else if (event.keyCode == 38) {
 74             this.index--;
 75             if (this.index < -1) {
 76                 this.index = length - 1;
 77             } else if (this.index == -1) {
 78                 this.obj.value = this.search_value;
 79             }
 80             this.changeClassname(length);
 81         }
 82         //回车键
 83         else if (event.keyCode == 13) {
 84             this.autoObj.className = "auto_hidden";
 85             this.index = -1;
 86         } else {
 87             this.index = -1;
 88         }
 89     },
 90     //程序入口
 91     start: function (event) {
 92         if (event.keyCode != 13 && event.keyCode != 38 && event.keyCode != 40) {
 93             this.init();
 94             this.deleteDIV();
 95             this.search_value = this.obj.value;
 96             var valueArr = this.value_arr;
 97             valueArr.sort();
 98             if (this.obj.value.replace(/(^\s*)|(\s*$)/g, ‘‘) == "") { return; } //值为空,退出
 99             try { var reg = new RegExp("(" + this.obj.value + ")", "i"); }
100             catch (e) { return; }
101             var div_index = 0; //记录创建的DIV的索引
102             for (var i = 0; i < valueArr.length; i++) {
103                 if (reg.test(valueArr[i])) {
104                     var div = document.createElement("div");
105                     div.className = "auto_onmouseout";
106                     div.seq = valueArr[i];
107                     div.onclick = this.setValue(this);
108                     div.onmouseover = this.autoOnmouseover(this, div_index);
109                     //搜索到的字符粗体显示
110                     div.innerHTML = valueArr[i].replace(reg, "<strong style=\"background-color:red\">$1</strong>");
111                     this.autoObj.appendChild(div);
112                     this.autoObj.className = "auto_show";
113                     div_index++;
114                 }
115             }
116         }
117         this.pressKey(event);
118         window.onresize = Bind(this, function () { this.init(); });
119     }
120 }

 Demo下载:

 http://files.cnblogs.com/files/xinchun/DropDownLikeBaiDu.zip

点滴积累【JS】---JS实现仿百度模糊搜索效果

标签:

原文地址:http://www.cnblogs.com/xinchun/p/5771181.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!