自动补全下拉框(可输入婚配的下拉框)

自动补全下拉框(可输入匹配的下拉框)

效果如下:
自动补全下拉框(可输入婚配的下拉框)
 

JSP页面代码:
自动补全下拉框(可输入婚配的下拉框)
    注意事项:

               依赖 jquery

               name="supplierCode" textName="supplierName" , supplierCode会绑定到一个input[hidden] 上对应的是选项的值,supplierName对应的是选项显示的文本。

               url对应的值是下拉列表数据来源。 返回类型是 List<xxDto> xxDto包含code, name 两个属性,具体格式可以根据自己的需求稍作修改

 

/***
 * 自动检索下拉框
 */
.autoSelect {
	background: url("../images/select-icon.png") right no-repeat;
 }
input[type=text]::-ms-clear {display:none;}

.autoSelectDiv {
	background-color: #FFFFFF;
	position: absolute;
	display: none;
	max-height: 283px;
	overflow: auto;
	border-top: 1px solid #CCCCCC;
	border-bottom: 1px solid #CCCCCC;
	z-index: 100;
}
.autoSelectDiv ul {
	list-style:none;
	padding: 0px;
	margin-bottom: 0px;
	max-height: 283px;
}
.autoSelectDiv ul li {
	border:1px solid #CCCCCC;
	border-top:none;
	padding:6px;
	cursor:pointer;
	height: 28px;
}
.autoSelectDiv ul:first-child {
	border-top:1px solid #CCCCCC;
}
.autoSelectDiv ul li:hover {
	background-color: #ddd;
}
.autoSelectDiv .active {
	background-color: #3276b1;
	color: #ffffff;
}

 

/***
 * 自动补全下拉框
 * 
 * 输入框设置:class="autoSelect"
 * 使用的时候 $("#tableID").autoSelect();
 * @param $
 */
(function($){
	$.fn.autoSelect = function(callback) {
		$(this).find(".autoSelect").each(function(i, v) {
			// 输入框
			var inputAuto = $(this);
			$(inputAuto).attr("autocomplete", "off");
			var codeName = $(inputAuto).attr("name");
			var textName = $(inputAuto).attr("textName");
			$(inputAuto).removeAttr("name");
			var inputHdCode = '<input type="hidden" class="hdCode" name="'+codeName+'" />';
			var inputHdName = '<input type="hidden" class="hdName" name="'+textName+'" />';
			var htmlDiv = '<div class="autoSelectDiv" isHover="false" ></div>';
			
			$(inputAuto).after(htmlDiv).after(inputHdName).after(inputHdCode);
			var isCalcLen = false; // 第一次点击的时候重新计算一下div的宽度,优化
			var isCalcLen1 = false; // 第一次点击的时候重新计算一下div的宽度,优化
			$(inputAuto).focus(function(){
				var divAT = $(this).parent().find(".autoSelectDiv");
				var inputWidth = $(this).outerWidth();
				var divWidth = $(divAT).outerWidth();
				if(!isCalcLen && parseInt(divWidth) < parseInt(inputWidth)) {
					isCalcLen = true;
					$(divAT).css({width: parseInt(inputWidth)});
				}
				divWidth = $(divAT).outerWidth();
				if(!isCalcLen1 && $(divAT).find("ul li").length>10) {
					isCalcLen1 = true;
					$(divAT).css({width: parseInt(divWidth) + 17});
				}
				$(divAT).show();
			});
			
			// 显示div
			var divAuto = $(inputAuto).parent().find(".autoSelectDiv");
			
			$(divAuto).unbind("hover")
			.hover(
				function() {
					$(this).attr("isHover", "true");
				}, function() {
					$(this).attr("isHover", "false");
				});
			$(inputAuto).unbind("hover")
			.hover(
				function() {
					$(this).attr("isHover", "true");
				}, function() {
					$(this).attr("isHover", "false");
				});
			$(inputAuto).blur(function(){
				var isHover = $(divAuto).attr("isHover");
				if(isHover!="true") {
					$(divAuto).hide();
					if(callback && typeof(callback)=="function") {
						callback($(inputAuto));
					}
				}
			});
			$("body").click(function(){
				var isDivHover = $(divAuto).attr("isHover");
				var isInputHover = $(inputAuto).attr("isHover");
				if(isDivHover=="false" && isInputHover=="false") {
					$(divAuto).hide();
					if(callback && typeof(callback)=="function") {
						callback($(inputAuto));
					}
				}
			});
			
		});
	}
})(jQuery);


var optionAllText = "------- 全部 -------";
/***
 * 绑定自动补全下拉框
 * @param contanerId 容器ID
 * @param ifAll 是否需要全选
 * @param callback 回调函数
 * @return
 */
function bindAutoSelect(contanerId, ifAll, callback){
	$("#"+contanerId).autoSelect(function(inputAutoObj){
			// 如果没有选择,关闭选项div的时候清空输入框的内容
			var hdCode = $(inputAutoObj).parent().find("input[type='hidden'].hdCode").val();
			if(hdCode=="" && $(inputAutoObj).val()!=optionAllText) {
				$(inputAutoObj).val("");
				loadSelectOptions($(inputAutoObj).attr("url"), "", inputAutoObj, ifAll, false, "", callback);
			}
		});
	$("#"+contanerId + " .autoSelect").each(function(){
		var inputAuto = $(this);
		$(inputAuto).attr("placeholder","------- 请选择 ------");
		var filterText = $(inputAuto).val();
		var dftVal = $(inputAuto).attr("dftVal");
		var url = $(inputAuto).attr("url");
		
		if(dftVal) {
			loadSelectOptions(url, filterText, inputAuto, ifAll, true, dftVal, callback);
		} else {
			loadSelectOptions(url, filterText, inputAuto, ifAll, true, "", callback);
		}
		
		var origVal = "";
		$(inputAuto).focus(function() {
			origVal = $(this).val();
		});
		$(inputAuto).keyup(function(){
			if($(this).val() && $(this).val()==origVal) {
				return;
			}
			if(origVal==optionAllText) {
				origVal = "";
				$(this).val("");
			}
			$(this).parent().find("input[type='hidden'].hdCode").val("");
			$(this).parent().find("input[type='hidden'].hdName").val("");
			var text = $(this).val();
			loadSelectOptions(url, text, this, ifAll, false, "", callback);
		});
	});
}

/***
 * 加载下拉列表
 * @param url
 * @param filterText
 * @param inputAuto
 * @param ifAll 是否需要全选
 * @param isLoad 默认加载(true页面进来自动加载,false:输入检索自动补全时)
 * @param dftCode 默认值
 * @param callback 回调
 * @return
 */
function loadSelectOptions(url, filterText, inputAuto, ifAll, isLoad, dftCode, callback) {
	$.ajax({
		url: url,
		type:"post",
		data:{filterText:filterText},
		success:function(data){
			var divAuto = $(inputAuto).parent().find(".autoSelectDiv");
			if(data && data.length>0){
				var hdCode = $(inputAuto).parent().find("input[type='hidden'].hdCode");
				var hdName = $(inputAuto).parent().find("input[type='hidden'].hdName");
				var htmlUl = '<ul>';
				// 加载的时候, 有默认值就选择默认值, 没有就默认选择第一个
				if(dftCode) {
					if(ifAll===true && (filterText=="" || filterText==optionAllText)) {
						htmlUl += '<li code="">'+optionAllText+'</li>';
					}
					for(var i=0; i<data.length; i++) {
						var vCode = data[i]["code"];
						var vName = data[i]["name"];
						if(dftCode==vCode) {
							htmlUl += '<li code="'+vCode+'" class="active">'+vName+'</li>';
							$(inputAuto).val(vName);
							$(hdCode).val(vCode);
							$(hdName).val(vName);
						} else {
							htmlUl += '<li code="'+vCode+'">'+vName+'</li>';
						}
					}
				} else {
					if(ifAll===true && (filterText=="" || filterText==optionAllText)) {
						if(isLoad || $(inputAuto).val()==optionAllText) {
							htmlUl += '<li code="" class="active">'+optionAllText+'</li>';
						} else {
							htmlUl += '<li code="">'+optionAllText+'</li>';
						}
					}
					for(var i=0; i<data.length; i++) {
						var vCode = data[i]["code"];
						var vName = data[i]["name"];
						if(i==0) {
							// 如果是输入检索自动补全的时候, isLoad为false
							if(ifAll===true && isLoad) {
								$(inputAuto).val(optionAllText);
								htmlUl += '<li code="'+vCode+'">'+vName+'</li>';
//								$(hdCode).val("");
//								$(hdName).val("");
							} else if(isLoad) {
								htmlUl += '<li code="'+vCode+'" class="active">'+vName+'</li>';
								$(inputAuto).val(vName);
								$(hdCode).val(vCode);
								$(hdName).val(vName);
							} else {
								htmlUl += '<li code="'+vCode+'">'+vName+'</li>';
							}
						} else {
							htmlUl += '<li code="'+vCode+'">'+vName+'</li>';
						}
					}
				}
				htmlUl += '</ul>';

				$(divAuto).html(htmlUl);
				$(divAuto).find("ul li").unbind("click").click(function(){
					var code = $(this).attr("code");
					var name = $(this).html();

					var cnt = $(this).parent().parent().parent();
					$(cnt).find("input[type='hidden'].hdCode").val("");
					$(cnt).find("input[type='hidden'].hdName").val("");
					var ia = $(this).parent().parent().parent().find(".autoSelect");
					if(code=="" && name==optionAllText) {
						$(ia).val(optionAllText);
					}

					$(divAuto).hide();
					
					loadSelectOptions(url, "", $(ia), ifAll, false, code, callback);
				});
				
				// 回调函数
				if(callback && typeof(callback)=="function") {
					callback();
				}
			} else {
				$(divAuto).html('<ul><li class="text-center text-danger">无匹配项</li></ul>');
			}
		}
	});
}