jQuery AutoComplete实现

注:该插件是在"VictorLi"所写的AutoComplete的基础上改进的,特此说明!

原文地址:http://www.oschina.net/code/snippet_102776_3656

本人平时是用的easyui开发,但恼火的是easyui没有autoComplete功能插件,虽然有一个combobox能在页面实现该功能,但是只适用于少量静态数据,不能动态查询。而jQuery UI提供了该功能,但是又不能跟easyui兼容,所以本人找到了"VictorLi"写的这个插件,但是使用后发现还是有很多地方有bug而且没有提供demo,所以自己整理了下发出来,希望对遇到该情况的朋友有点帮助

该插件使用起来很方便,几行代码即可,需要修改源码的朋友注意看注释

demo

JS部分:

$("#input_id").zhAutoComplete({
				url : 'test.do',
				format : ['NAME', 'ID'],
				maxLength : 6
			});

HTML部分:

<input type="text" id="input_id" style="width: 120px;">

 

 

 

源码:

/**
 * 简单实用的支持中文的自动完成插件
 * 
 * @param url
 *            获得数据的URL
 * @param q
 *            查询用关键字名称
 * @param boxId
 *            外边框ID
 * @param tblId
 *            内表格ID
 * @param format
 *            返回数据格式,默认为null,如返回JSON数据为[{id:'aaa',name:'ccccc'}]
 *            format:['name','id'],其中第一个项会作为text显示出来,其它项会作为afterSelect中对象属性
 * @param processData
 *            对返回的数据进行预处理 最后 return 处理过的数据即可
 * @param showList
 *            如何显示数据
 * @param select
 *            选中一条记录时触发
 * @param afterSelect
 *            选中一条记录后触发
 * @param rowHeight
 *            行高
 * @param maxLength
 *            最大行数
 * @param zIndex
 *            层的zIndex属性,防止被其他层覆盖
 * 
 * @example
 * $("#input_id").zhAutoComplete({url:'test.php'});
 * 
 * @example
 * override actions
 * $("#input_id").zhAutoComplete({url:'test.php',processData:function(data}{},afterSelect:
 * function(td){td.id ....});
 */

jQuery.fn.zhAutoComplete = function(options) {
	var keyWordOld = null;
	var input = $(this);
	$(input).attr("autocomplete", "off");
	var offset = {};
	offset.width = $(this).width();
	var settings = {
		url : 'test.php',
		q : 'name',
		format : null,
		maxLength : 10,
		type : 'json',
		boxId : '_zhAC_Box',
		zIndex : 10,
		tblId : '_ZhAC_Table',
		offset : offset,
		rowHeight : 18,
		processData : function(data) {
			return data;
		},
		showList : function(data) {
			if ($("#" + settings.boxId).length > 0)
				$("#" + settings.boxId).remove();
			if (data.length == 0)
				return;
			var top = document.getElementById(input[0].id)
					.getBoundingClientRect().top;
			var left = document.getElementById(input[0].id)
					.getBoundingClientRect().left;
			var width = settings.offset.width - 1;

			var box = $("<div id='" + settings.boxId + "'></div>");
			var table = $("<table id='" + settings.tblId + "' style='font-size: 12px;font-family: \"宋体\";'></table>");
			if (data.length > settings.maxLength) {
				$(box).css({
							'background-color' : '#FFFFFF',
							position : 'absolute',
							border : '1px solid #817F82',
							'z-index' : settings.zIndex,
							top : top + $(input).height() + 5,
							left : left,
							width : width + 1,
							height : settings.maxLength * settings.rowHeight,
							'overflow-y' : 'auto'
						});
			} else {
				$(box).css({
							'background-color' : '#FFFFFF',
							position : 'absolute',
							border : '1px solid #817F82',
							'z-index' : settings.zIndex,
							top : top + $(input).height() + 5,
							left : left,
							width : width + 1
						});
			}
			$(table).attr("cellpadding", 2).attr("cellspacing", 0).attr(
					"width", "100%").attr("border", 0);
			for (i = 0; i < data.length; i++) {
				var tr = $("<tr></tr>");
				tr.css({
							cursor : 'pointer',
							'padding-top' : '2px',
							'padding-buttom' : '2px'
						});
				if (settings.format) {
					var td = $("<td style='padding-left:5px;'>"
							+ data[i][settings.format[0]] + "</td>");
					for (j = 1; j < settings.format.length; j++) {
						$(td).attr(settings.format[j],
								data[i][settings.format[j]]);
					}
				} else {
					var td = $("<td style='padding-left:5px;'>" + data[i]
							+ "</td>");
				}
				$(tr).append(td);
				$(table).append(tr);
			}

			$(box).append(table);
			$("body").append(box);

			$("#" + settings.tblId + " tr").bind("mouseover", function() {
						$(this).css("background-color", "#E2EAFF")
					}).bind("mouseout", function() {
						$(this).css("background-color", "#FFFFFF")
					});

			$("#" + settings.tblId + " tr td").bind("click", function() {
						keyWordOld = $(this).text();
					});
			$("#" + settings.tblId + " tr td").bind("click",
					settings.selectParam);
			$(document).bind("click", function() {
						$(box).remove()
					});
		},
		selectParam : function() {
			$(input).val($(this).text());
			settings.afterSelect($(this));
		},
		afterSelect : function(td) {
			console.log("calling afterSelect function...");
		}
	};

	options = options || {};
	$.extend(settings, options);
	$(this).bind("keyup", function(event) {
				if (event.keyCode >= 37 && event.keyCode <= 40)
					return;
				var keyword = $.trim($(this).val());
				if (!keyword) {
					return;
				} else {
					if (keyWordOld == keyword) {
						return;
					}
					keyWordOld = keyword;
				}
				param = settings.q + "=" + keyword;
				$.get(settings.url, param, function(data) {
							var ds = settings.processData(data);
							settings.showList(ds);
						}, settings.type);
			});
};


 


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值