jquery autocomplete 自动提示

下面是自动提示的例子参考:
jsp代码
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>测试自动提示</title>
<script type="text/javascript" src="/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui.min.js"></script>
<style type="text/css">
.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus
	{
	border: 0px /*{borderColorHover}*/;
	background: #E6E6E6 /*{bgColorHover}*/;
	font-weight: normal /*{fwDefault}*/;
	color: #0d519c /*{fcHover}*/;
}

.ui-menu .ui-menu-item a {
	color: #0d519c;
}

.ui-menu {
	list-style: none;
	padding: 2px;
	margin: 0;
	display: block;
	float: left;
	background-color: #fff;
	width: auto;
	border: 1px solid #0d519c;
}
</style>
</head>
<body>
	<table>
		<tr>
			<td align="center"><input id="insrShow" type="text"
				size="100" value="" initvalue="输入保险产品代码或名称"
				style="color: rgb(136, 136, 136);" />
			<input type="hidden" id="hiddle_code" name="addCode" />
			</td>
		</tr>
		<tr>
			<td>
				<input type="hidden" id="m_code" />
				<input type="hidden" id="m_sname" />
			</td>
		</tr>
	</table>
	<script type="text/javascript">
		var config = {
			id : "",
			selectFun : function(sname, code) {
				$("#" + this.id).val(sname);
			},
			txt : "请输入保险产品代码\名称"
		};

		function match_init(obj) {
			for ( var key in obj) {
				config[key] = obj[key];
			}
			if ($("#" + config.id).attr("initValue") != null) {
				config.txt = $("#" + config.id).attr("initValue");
			} else {
				$("#" + config.id).attr("initValue", config.txt);
			}
		}

		$(function() {
			$("#" + config.id).autocomplete({
				source : function(request, response) {
					if ($("#" + config.id).val() == "") {
						return;
					}
					$.ajax({
						type : "post",
						url : "/money/baoxian/getinsr.shtml",
						data : {
							input : $("#" + config.id).val()
						},
						dataType : 'jsonp',
						jsonp : 'jsoncallback', //默认callback
						success : function(data) {
							var arr = eval('(' + data.json + ')');
							response($.map(arr, function(item) {
								return {
									label : item.innerCode,
									cname : item.cname
								};
							}));
						}
					});
				},
				select : function(event, ui) {
					var code = ui.item.label;
					config.selectFun(ui.item.cname, code);
					$("#m_code").val(code);
					$("#m_sname").val(ui.item.cname);
					return false;
				},
				focus : function(event, ui) {
					return true;
				},
				minLength : 1,
				autoFocus : true
			}).data("ui-autocomplete")._renderItem = function(ul, item) {
				return $("<li>")
						.append("<a >" + "<span style='float:left;width:85px;padding-right:5px;text-align:left;'>"
									   + item.label + "</span>" + "<span>" + item.cname + "</span>" + "</a>")
						.appendTo(ul);
			};
		});
		function txtInputHint(id){
			var txtInput = $("#" + id);
			if(txtInput.val() == ""){
				txtInput.val(txtInput.attr("initValue"));
			}
			txtPromptFocus(id,txtInput.attr("initValue"));
			txtPromptBlur(id,txtInput.attr("initValue"));
		}
		var txtPromptFocus = function(id,txt){
			var obj = $("#" +id);
			obj.bind("focus",function(){
				if(obj.val() == txt){
					obj.val("");
				}
				obj.css("color","black");
			});
		};
		var txtPromptBlur = function(id,txt){
			var obj = $("#" + id);
			obj.bind("blur", function(){
				if($.trim(obj.val()) == "" || $.trim(obj.val()) == txt){
					obj.val(txt);
					obj.css("color","#888888");
				}else{
					obj.css("color","black");
				}
			});
		};
		$(function() {
			$("#" + config.id).click(function() {
				$("#" + config.id).autocomplete("search");
			});
		});
		$(function() {
			txtInputHint(config.id);
			$("#" + config.id).blur();
		});
		
		$(function() {
			$("#insrShow").click(function() {
				$("#insrShow").autocomplete("search");
			});
		});
		match_init({
			id : "insrShow",
			selectFun : function(sname, code) {
				$("#hiddle_code").val(code);
				$("#insrShow").val(sname);
			}
		});
	</script>
</body>
</html>

后台程序如下:

使用struts2-spring-mybatis框架

package net.makshi.site.action;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.makshi.data.site.domain.InsrPrdInfo;
import net.makshi.data.site.service.InsuranceService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller("insuranceMatch")
@Scope("prototype")
public class InsuranceMatchAction extends BaseAction {

	private static final long serialVersionUID = 2455845010943810441L;

	/**
	 * 最大证券代码长度
	 */
	public static int MAX_CODE_LEN = 9;
	/**
	 * 最大提示数
	 */
	public static int MAX_PROMPT = 10;

	@Autowired
	private InsuranceService insuranceService;

	private String input;

	private String json;

	public String getInsr() {
		input = input.toUpperCase();
		Pattern pattern = Pattern.compile(input);
		List<InsrMatcher> matchList = new LinkedList<InsrMatcher>();
		Map<String,Object> param = new HashMap<String,Object>();
		List<InsrPrdInfo> insrPrdInfoList = insuranceService.selectInsrPrdInfoCodeAndName(param);
		Iterator<InsrPrdInfo> iterator = insrPrdInfoList.iterator();
		int count = 0;// 最佳位置(0)匹配数
		while (iterator.hasNext()) {
			InsrPrdInfo ipi = iterator.next();
			boolean find = false;
			Matcher matcher = pattern.matcher(ipi.getInnerCode().toString());
			find = matcher.find();

			int start = -1;
			if (find) {
				start = matcher.start();
			}

			// 匹配中文名
			matcher = pattern.matcher(ipi.getPrdName().toUpperCase());
			if (matcher.find()) {
				if (!find) {// 前面没有找到
					find = true;// 找到
					start = matcher.start();
				} else if (matcher.start() < start) {
					start = matcher.start();// 如果匹配位置更加靠前,则使用更加靠前的位置
				}
			}

			if (find) {
				InsrMatcher iMatcher = new InsrMatcher(start,ipi.getInnerCode(),ipi.getPrdName());
				this.putIntoMatchList(matchList, iMatcher);
				if (0 == start) {
					++count;
				}
				if (count >= MAX_PROMPT) {// 最多需要 10 个
					break;
				}
			}
		}
		// 构造 json 字符串
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (InsrMatcher tmp : matchList) {
			String iCode = String.valueOf(tmp.getInnerCode());
			String cname = tmp.getPrdName();

			sb.append("{innerCode:\"").append(iCode)
					.append("\",cname:\"").append(cname)
					.append("\"" + "},");
		}
		if (sb.length() > 1) {
			sb.deleteCharAt(sb.length() - 1);// 删除最后一个“,”号
		}
		sb.append("]");
		this.setJson(sb.toString());

		return SUCCESS;
	}

	private void putIntoMatchList(List<InsrMatcher> matchList,
			InsrMatcher iMatcher) {
		if (iMatcher.getPrj() > 0) {
			matchList.add(0, iMatcher);// 需要修改!!!!!!!!!!
			if (matchList.size() > MAX_PROMPT) {// 超载
				matchList.remove(MAX_PROMPT);
			}
			return;
		}
		int i = matchList.size() - 1;
		for (; i >= 0; i--) {
			InsrMatcher tmp = matchList.get(i);
			if (iMatcher.getStart() >= tmp.getStart()) {
				matchList.add(i + 1, iMatcher);// 按匹配位置先后
				break;
			}
		}
		if (i < 0) {// 尚未加入
			matchList.add(0, iMatcher);// 最佳匹配(位置最先),加到开头
		}
		if (matchList.size() > MAX_PROMPT) {// 超载
			matchList.remove(MAX_PROMPT);
		}
	}

	public String getInput() {
		return input;
	}

	public void setInput(String input) {
		this.input = input;
	}

	public String getJson() {
		return json;
	}

	public void setJson(String json) {
		this.json = json;
	}
}

class InsrMatcher{
	public static int PRJ_STOCK = 9;

	/**
	 * 优先级
	 */
	private int prj;
	/**
	 * 匹配位置
	 */
	private int start;
	private int innerCode;
	private String prdName;
	
	public InsrMatcher() {
	}
	
	public InsrMatcher(int prj, int innerCode) {
		this.prj = prj;
		this.innerCode = innerCode;
	}

	public InsrMatcher(int prj, int innerCode, String prdName) {
		this.prj = prj;
		this.innerCode = innerCode;
		this.prdName = prdName;
	}

	public int getPrj() {
		return prj;
	}
	public void setPrj(int prj) {
		this.prj = prj;
	}
	public int getStart() {
		return start;
	}
	public void setStart(int start) {
		this.start = start;
	}
	public int getInnerCode() {
		return innerCode;
	}
	public void setInnerCode(int innerCode) {
		this.innerCode = innerCode;
	}
	public String getPrdName() {
		return prdName;
	}
	public void setPrdName(String prdName) {
		this.prdName = prdName;
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值