输入联想JS实现
       近期做项目的时候需要用到联想输入,类似于百度的输入,当用户输入非空,需要提示出所有可能的选项(这里是查询数据库),用户可以使用联想输入进行快速选择输入,根据经验及网上资料,最后实现了该功能,JS如下:
/**
 * 联想输入框的实现
 *
 * @param objid	页面输入框对应的obj标签的Id
 * @param flag	联想输入对应的操作,数字,与action中实现对应
 */
function inputThinking(objid, flag) {
	// 输入框父节点Id
	var pid = objid + "_input";
	//输入框的Id
	var inputId = objid + "_input_value";	
	// 获取输入框宽度,根据宽度自适应
	var width = $("#" + pid).css("width");
	if(width && width.indexOf('px') > 0) {
		width = width.substring(0, width.indexOf('px')) - 2;
	} else {
		width = 158;
	}	
	// 定义联想输入页面HTML, 定义输入框及联想输入页面的状态,状态1表示焦点状态,状态0表示非焦点状态
	var tipHTML = "<div id='thinking' style='background-color:white;position:fixed;z-index:999999;border:1px solid #CDE4EF; width:" + width + "px;overflow:hidden;overflow:hidden;display:none;background-image: theme/default/imagesmember_right1.png'><li> </li></div><input type='hidden' id='inputId' value='" + inputId + "'><input type='hidden' id='status' value='1'><input type='hidden' id='thinking_status' value='0'><style>li.sel{background:#4d77bb;color:white;}li{font-size:14px;height:18px;overflow:hidden;}</style>"	
	/**********	将联想输入页面嵌入原始页面	**********/
	$("#" + inputId).parent().append(tipHTML);		
	/**********	绑定输入框事件	**********/	
	// 输入框内容修改事件
	$("#" + inputId).bind("keyup", function(e) {
		if (e.keyCode == 38) {
			// 向上
			next(false);
		} else if(e.keyCode == 40) {
			// 向下
			next(true);
		} else {
			showThinking(inputId, flag);
		}
	});	
	// 单击事件,将输入框的状态置为1
	$("#" + inputId).bind("click", function() {
		// 设置输入框的状态为1
		$("#status").val(1);		
		showThinking(inputId, flag);
	});	
	// 单击事件,将输入框的状态置为1
	$("#" + inputId).bind("focus", function() {
		// 设置输入框的状态为1
		$("#status").val(1);		
		showThinking(inputId, flag);
	});	
	// 失去焦点事件,将输入框的状态置为0
	$("#" + inputId).bind("focusout", function() {
		// 设置输入框的状态为0
		$("#status").val(0);		
		// 当联想输入页面和输入框的状态均为0时隐藏联想输入页面
		if($("#thinking_status").val() && $("#thinking_status").val() == 0) {
			$("#thinking").css("display", "none");
		}
	});	
	/**********	绑定联想输入页面事件	**********/	
	// 鼠标移动事件
	$("#thinking").bind("mousemove", function() {
		// 设置联想输入页面的状态为1
		$("#thinking_status").val(1);
	});	
	// 鼠标移出事件
	$("#thinking").bind("mouseout", function() {
		// 设置联想输入页面的状态为0
		$("#thinking_status").val(0);		
		// 当联想输入页面和输入框的状态均为2时隐藏联想输入页面
		if($("#status").val() && $("#status").val() == 0) {
			$("#thinking").css("display", "none");
		}
	});	
	/**********	end	**********/
}
/**
 * 根据状态刷新数据,并显示联想输入框
 *
 * @param inputId	页面input输入框对应的Id
 * @param flag	联想输入对应的操作,数字,与action中实现对应
 */
function showThinking(inputId, flag) {
	var value = $.trim($("#" + inputId).val());
	// 只有输入框非空的时候才调用输入联想
	if(value && value != null && value != '') {
		// 发送ajax初始化输入联想页面
		$.ajax({
			type: "POST",
			async: false,
			// 调用的action定义
			url: 对应的请求地址,
			data: 请求参数,
			// 回调函数
			success: function(html) {
				// 返回的如果是异常则跳过
				if(没有抛出异常或者成功返回结果判断) {
					$("#thinking").html(html);		
					// 显示联想输入页面
					$("#thinking").css("display", "block");
				}
			},
			error: function(msg) {
				alert(msg);
			}
		});
	} else {
		$("#thinking").html("");
	}
}
function next(flag) {
	var obj = get($("#thinking li.sel"), 0);
	var next = null;
	if(obj) {
		next = get(fl