模仿百度搜索框,進行聯想搜索

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>input自動補全</title>
		<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
	</head>
	<style>
		#searchForm {
			z-index: 999;
			position: absolute;
			top: 10px;
			text-align: center;
			margin: 0 auto;
			left: 0;
			right: 0;
			bottom: 0;
		}
		
		#query {
			width: 300px;
			font-size: 16px;
			height: 34px;
			line-height: 34px;
			box-sizing: border-box;
			outline: 1;
			border: 1px solid #d3d3d3;
		}
		
		#query:focus {
			border: 1px solid #2d78f4;
		}
		
		#search {
			width: 100px;
			height: 34px;
			color: #fff;
			font-family: arial;
			border: none;
			vertical-align: top;
			outline: none;
			background-color: #38f;
		}
		
		#search:hover {
			background-color: #2d78f4;
			cursor: pointer;
		}
		
		.auto {
			width: 300px;
			border: 1px solid #dedede;
			border-top: none;
			position: absolute;
		}
		
		.auto_out {
			width: 300px;
			height: 36px;
			line-height: 36px;
			padding-left: .5em;
			color: #000;
			background: #fff;
			overflow: hidden;
			white-space: nowrap;
			-o-text-overflow: ellipsis;
			text-overflow: ellipsis;
		}
		
		.auto_out.on {
			background: #eee;
			cursor: pointer;
		}
		
		.hidden {
			display: none;
		}
	</style>

	<body>
		<div id="searchForm">
			<input id='query' type="text" class="auto-inp" onBlur="shijiao()"></input>
			<button id="search">搜索一下</button>
			<div class="auto hidden" id="auto">

			</div>
		</div>

		<script type="text/javascript" src="js/auto.js"></script>
		<script>
			var array = ['七里香', 'b0', 'b12', 'b22', '固戍', 'b4', 'b5', 'b6', '如果愛', 'b7', 'b8', 'b2', 'abd', 'ab', '西鄉', 'accd', 'abd', 'qq音樂', 'b1', 'cd', 'ccd', 'cbcv', '小王子', 'cxf', 'b0'];
			var autoComplete = new AutoComplete("query", "auto", array);
			document.getElementById("query").onkeyup = function(event) {
				autoComplete.start(event);
			}

			//模糊查詢方法失焦事件
			function shijiao() {
				$("#auto").empty();
			};
		</script>
	</body>

</html>
// 數組去重
Array.prototype.unique = function(){
	this.sort();
	var res = [];
	var json = {};
	for (var i = 0; i < this.length; i++) {
		if(!json[this[i]]){
			res.push(this[i]);
			json[this[i]] = 1;
		}
	}
	return res;
}
 
// 對樣式操作
var setClass = {
	hasClass: function(elements,cName){	// 判斷是否含有某個class
		if(elements.className.match(new RegExp( "(\\s|^)" + cName + "(\\s|$)") ))
			return true;
		else
			return false;
	},
	addClass: function(elements,cName){	// 添加class
		if( !this.hasClass( elements,cName ) ){ 
			elements.className += " " + cName; 
		};
	},
	removeClass: function(elements,cName){	// 移除某個class
		if( this.hasClass( elements,cName ) ){ 
			elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " ); 
		}
	}
}
 
var Bind = function(This){
	return function(){
		This.init();
	}
}
 
function AutoComplete(input,auto,arr) {
	this.obj = document.getElementById(input);
	this.autoObj = document.getElementById(auto);
	this.search_value = "";	//當前的搜索輸入值
	this.index = -1;		//當前選中的DIV的索引
	this.value_arr = arr;	//數據庫中供檢索的值 不包含重複值
}
AutoComplete.prototype = {
	// 初始化
	init: function(){
		var This = this;
		setClass.removeClass(This.autoObj,"hidden");
		this.autoObj.style.left = this.obj.offsetLeft + "px";
		this.autoObj.style.top = this.obj.offsetTop + this.obj.offsetHeight + "px";
	},
	//刪除自動完成需要的所有DIV
	deleteDIV: function(){
		while(this.autoObj.hasChildNodes()){
			this.autoObj.removeChild(this.autoObj.firstChild);
		}
		setClass.addClass(this.autoObj,"hidden");
	},
	autoOnmouseover: function(index){
		if(index != this.index){
			setClass.addClass(this.autoObj.children[index],"on");
			setClass.removeClass(this.autoObj.children[this.index],"on");
			this.index = index;
		}
	},
	setValue: function(This){
		return function(){
			This.obj.value = this.seq;
			setClass.addClass(This.autoObj,"hidden");
		}
	},
	// 響應鍵盤
	pressKey: function(event){
		var code = event.keyCode;
		var length = this.autoObj.children.length;
		if(code == 38){		//↑
			setClass.removeClass(this.autoObj.children[this.index],"on");
			this.index--;
			if(this.index < 0){
				this.index = length - 1;
			}
			setClass.addClass(this.autoObj.children[this.index],"on");
			this.obj.value = this.autoObj.children[this.index].seq;
		}else if(code == 40){	//↓
			setClass.removeClass(this.autoObj.children[this.index],"on");
			this.index++;
			if(this.index > length-1){
				this.index = 0;
			}
			setClass.addClass(this.autoObj.children[this.index],"on");
			this.obj.value = this.autoObj.children[this.index].seq;
		}else{			//回車
			this.obj.value = this.autoObj.children[this.index].seq;
			setClass.addClass(this.autoObj,"hidden");
			this.index = -1;
		}
	},
	// 程序入口
	start: function(event){
		event = event || window.event;
		var code = event.keyCode;
		var This = this;
		if(code != 13 && code != 38 && code != 40){
			this.init();
			this.deleteDIV();
			this.search_value = this.obj.value;
			var valueArr = this.value_arr.unique();
			//去掉前後空格不能爲空
			if(this.obj.value.replace(/(^\s*)|(\s*$)/g,"") == ""){ return;}
			//判斷數組中是否含有輸入的關鍵字
			try{
				var reg = new RegExp("("+ this.obj.value +")","i");	//輸入"aaa" 則 reg = /(aaa)/i
			}catch(e){
				alert(e.message); 
			}
			var div_index = 0;	//記錄匹配索引個數
			for (var i = 0; i < valueArr.length; i++) {
				if(reg.test(valueArr[i])){
					var div = document.createElement("div");
					div.className = "auto_out";
					div.seq = valueArr[i];
					div.index = div_index;
					div.innerHTML = valueArr[i].replace(reg,"<strong>$1</strong>");
					this.autoObj.appendChild(div);
					setClass.removeClass(this.autoObj,"hidden");
					div_index++;
					if(div_index == 1) {
						setClass.addClass(this.autoObj.firstChild,"on");
						this.index = 0;
					}
					div.onmouseover = function(){
						This.autoOnmouseover(this.index);
					}
					div.onclick = this.setValue(This);
				}
			}
		}else{
			this.pressKey(event);
		}
		window.onresize = Bind(This);
	}
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章