Jquery Autocomplete 实例教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyao880609/article/details/51132963

web项目填写表单时候select选项经常会有特别多,这时可以考虑使用Jquery Autocomplete插件,它能根据条件很好的定位指定选项。博主为了优化此类现象,运用了自动完成插件,在这里博主将结合实例分享给大家,也好自己做备份。

描述:自动完成功能根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择。

参考:博主用的是jquery-autocomplete-1.1.js版本,检索内容由于是固定的所以定义了枚举类来封装数据源(如果检索内容在数据库中需要自己定义缓存,并且根据需要还有可能需要数据库和缓存同步操作。),如下:

public enum NationType {
	ASIA("AP", "Asia/Pacific Region"),
	EUROPE("EU", "Europe"),
	ANDORRA("AD", "Andorra"),
	EMIRATES("AE", "United Arab Emirates"),
	AFGHANISTAN("AF", "Afghanistan"),
	BARBUDA("AG", "Antigua and Barbuda"),
	ANGUILLA("AI", "Anguilla"),
	ALBANIA("AL", "Albania"),
	ARMENIA("AM", "Armenia"),
	ANTILLES("AN", "Netherlands Antilles"),
	ANGOLA("AO", "Angola"),
	ANTARCTICA("AQ", "Antarctica"),
	ARGENTINA("AR", "Argentina"),
	AMERICANSAMOA("AS", "American Samoa"),
	AUSTRIA("AT", "Austria"),
	AUSTRALIA("AU", "Australia"),
	ARUBA("AW", "Aruba"),
	AZERBAIJAN("AZ", "Azerbaijan"),
	HERZEGOVINA("BA", "Bosnia and Herzegovina"),
	BARBADOS("BB", "Barbados"),
	BANGLADESH("BD", "Bangladesh"),
	BELGIUM("BE", "Belgium"),
	FASO("BF", "Burkina Faso"),
	BULGARIA("BG", "Bulgaria"),
	BAHRAIN("BH", "Bahrain"),
	BURUNDI("BI", "Burundi"),
	BENIN("BJ", "Benin"),
	BERMUDA("BM", "Bermuda"),
	DARUSSALAM("BN", "Brunei Darussalam"),
	BOLIVIA("BO", "Bolivia"),
	BRAZIL("BR", "Brazil"),
	BAHAMAS("BS", "Bahamas"),
	BHUTAN("BT", "Bhutan"),
	ISLAND("BV", "Bouvet Island"),
	BOTSWANA("BW", "Botswana"),
	BELARUS("BY", "Belarus"),
	BELIZE("BZ", "Belize"),
	CANADA("CA", "Canada"),
	COCOS("CC", "Cocos (Keeling) Islands"),
	CONGODEM("CD", "Congo, The Democratic Republic of the "),
	CENTRAL("CF", "Central African Republic"),
	CONGO("CG", "Congo"),
	SWITZERLAND("CH", "Switzerland"),
	DIVOIRE("CI", "Cote D'Ivoire"),
	COOK("CK", "Cook Islands"),
	CHILE("CL", "Chile"),
	CAMEROON("CM", "Cameroon"),
	CHINA("CN", "China"),
	COLOMBIA("CO", "Colombia"),
	COSTARICA("CR", "Costa Rica"),
	CUBA("CU", "Cuba"),
	CAPEVERDE("CV", "Cape Verde"),
	CHRISTMAS("CX", "Christmas Island"),
	CYPRUS("CY", "Cyprus"),
	CZECH("CZ", "Czech Republic"),
	GERMANY("DE", "Germany"),
	DJIBOUTI("DJ", "Djibouti"),
	DENMARK("DK", "Denmark"),
	DOMINICA("DM", "Dominica"),
	DOMINICAN("DO", "Dominican Republic"),
	ALGERIA("DZ", "Algeria"),
	ECUADOR("EC", "Ecuador"),
	ESTONIA("EE", "Estonia"),
	EGYPT("EG", "Egypt"),
	WESTERN("EH", "Western Sahara"),
	ERITREA("ER", "Eritrea"),
	SPAIN("ES", "Spain"),
	ETHIOPIA("ET", "Ethiopia"),
	FINLAND("FI", "Finland"),
	FIJI("FJ", "Fiji"),
	FALKLAND("FK", "Falkland Islands (Malvinas)"),
	MICRONESIA("FM", "Micronesia, Federated States of"),
	FAROE("FO", "Faroe Islands"),
	FRANCE("FR", "France"),
	Metropolitan("FX", "France, Metropolitan"),
	GABON("GA", "Gabon"),
	KINGDOM("GB", "United Kingdom"),
	GRENADA("GD", "Grenada"),
	GEORGIA("GE", "Georgia"),
	GUIANA("GF", "French Guiana"),
	GHANA("GH", "Ghana"),
	GIBRALTAR("GI", "Gibraltar"),
	GREENLAND("GL", "Greenland"),
	GAMBIA("GM", "Gambia"),
	GUINEA("GN", "Guinea"),
	GUADELOUPE("GP", "Guadeloupe"),
	EQUATORIALGUINEA("GQ", "Equatorial Guinea"),
	GREECE("GR", "Greece"),
	SOUTHGEORGIA("GS", "South Georgia and the South Sandwich Islands"),
	GUATEMALA("GT", "Guatemala"),
	GUAM("GU", "Guam"),
	BISSAU("GW", "Guinea-Bissau"),
	GUYANA("GY", "Guyana"),
	HONGKONG("HK", "Hong Kong"),
	HEARDMCDONALD("HM", "Heard Island and McDonald Islands"),
	HONDURAS("HN", "Honduras"),
	CROATIA("HR", "Croatia"),
	HAITI("HT", "Haiti"),
	HUNGARY("HU", "Hungary"),
	INDONESIA("ID", "Indonesia"),
	IRELAND("IE", "Ireland"),
	ISRAEL("IL", "Israel"),
	INDIA("IN", "India"),
	BRITISHINDIAN("IO", "British Indian Ocean Territory"),
	IRAQ("IQ", "Iraq"),
	ISLAMIC("IR", "Iran, Islamic Republic o"),
	ICELAND("IS", "Iceland"),
	ITALY("IT", "Italy"),
	JAMAICA("JM", "Jamaica"),
	JORDAN("JO", "Jordan"),
	JAPAN("JP", "Japan"),
	KENYA("KE", "Kenya"),
	KYRGYZSTAN("KG", "Kyrgyzstan"),
	CAMBODIA("KH", "Cambodia"),
	KIRIBATI("KI", "Kiribati"),
	COMOROS("KM", "Comoros"),
	SAINT("KN", "Saint Kitts and Nevis"),
	KOREADEMOCRATIC("KP", "Korea, Democratic People's Republic of"),
	KOREAREPUBLIC("KR", "Korea, Republic of "),
	KUWAIT("KW", "Kuwait"),
	CAYMAN("KY", "Cayman Islands"),
	KAZAKSTAN("KZ", "Kazakstan"),
	LAO("LA", "Lao People's Democratic Republic"),
	LEBANON("LB", "Lebanon"),
	SAINTLUCIA("LC", "Saint Lucia"),
	LIECHTENSTEIN("LI", "Liechtenstein"),
	SRILANKA("LK", "Sri Lanka"),
	LIBERIA("LR", "Liberia"),
	LESOTHO("LS", "Lesotho"),
	LITHUANIA("LT", "Lithuania"),
	LUXEMBOURG("LU", "Luxembourg"),
	LATVIA("LV", "Latvia"),
	JAMAHIRIYA("LY", "Libyan Arab Jamahiriya"),
	MOROCCO("MA", "Morocco"),
	MONACO("MC", "Monaco"),
	MOLDOVA("MD", "Moldova, Republic of "),
	MADAGASCAR("MG", "Madagascar"),
	MARSHALL("MH", "Marshall Islands"),
	MACEDONIA("MK", "Macedonia, the Former Yugoslav Republic of"),
	MALI("ML", "Mali"),
	MYANMAR("MM", "Myanmar"),
	MONGOLIA("MN", "Mongolia"),
	MACAU("MO", "Macau"),
	NORTHERNMARIANA("MP", "Northern Mariana Islands"),
	MARTINIQUE("MQ", "Martinique"),
	MAURITANIA("MR", "Mauritania"),
	MONTSERRAT("MS", "Montserrat"),
	MALTA("MT", "Malta"),
	MAURITIUS("MU", "Mauritius"),
	MALDIVES("MV", "Maldives"),
	MALAWI("MW", "Malawi"),
	MEXICO("MX", "Mexico"),
	MALAYSIA("MY", "Malaysia"),
	MOZAMBIQUE("MZ", "Mozambique"),
	NAMIBIA("NA", "Namibia"),
	NEWCALEDONIA("NC", "New Caledonia"),
	NIGER("NE", "Niger"),
	NORFOLK("NF", "Norfolk Island"),
	NIGERIA("NG", "Nigeria"),
	NICARAGUA("NI", "Nicaragua"),
	NETHERLANDS("NL", "Netherlands"),
	NORWAY("NO", "Norway"),
	NEPAL("NP", "Nepal"),
	NAURU("NR", "Nauru"),
	NIUE("NU", "Niue"),
	NEWZEALAND("NZ", "New Zealand"),
	OMAN("OM", "Oman"),
	PANAMA("PA", "Panama"),
	PERU("PE", "Peru"),
	POLYNESIA("PF", "French Polynesia"),
	NEWGUINEA("PG", "Papua New Guinea"),
	PHILIPPINES("PH", "Philippines"),
	PAKISTAN("PK", "Pakistan"),
	POLAND("PL", "Poland"),
	PIERREMIQUELON("PM", "Saint Pierre and Miquelon"),
	PITCAIRN("PN", "Pitcairn"),
	PUERTORICO("PR", "Puerto Rico"),
	PALESTINIAN("PS", "Palestinian Territory, Occupied"),
	PORTUGAL("PT", "Portugal"),
	PALAU("PW", "Palau"),
	PARAGUAY("PY", "Paraguay"),
	QATAR("QA", "Qatar"),
	REUNION("RE", "Reunion"),
	ROMANIA("RO", "Romania"),
	RUSSIAN("RU", "Russian Federation"),
	RWANDA("RW", "Rwanda"),
	ARABIA("SA", "Saudi Arabia"),
	SB("SB", "SB"),
	SEYCHELLES("SC", "Seychelles"),
	SUDAN("SD", "Sudan"),
	SWEDEN("SE", "Sweden"),
	SINGAPORE("SG", "Singapore"),
	SAINTHELENA("SH", "Saint Helena"),
	SLOVENIA("SI", "Slovenia"),
	SVALBARDJANMAYEN("SJ", "Svalbard and Jan Mayen"),
	SLOVAKIA("SK", "Slovakia"),
	SIERRALEONE("SL", "Sierra Leone"),
	SANMARINO("SM", "San Marino"),
	SN("SN", "SN"),
	SOMALIA("SO", "Somalia"),
	SURINAME("SR", "Suriname"),
	SAOTOMPRINCIPE("ST", "Sao Tome and Principe"),
	ELSALVADOR("SV", "El Salvador"),
	SYRIANARAB("SY", "Syrian Arab Republic"),
	SWAZILAND("SZ", "Swaziland"),
	TURKSCAICOS("TC", "Turks and Caicos Islands"),
	CHAD("TD", "Chad"),
	SOUTHERNTERRITORIES("TF", "French Southern Territories"),
	TOGO("TG", "Togo"),
	THAILAND("TH", "Thailand"),
	TAJIKISTAN("TJ", "Tajikistan"),
	TOKELAU("TK", "Tokelau"),
	TURKMENISTAN("TM", "Turkmenistan"),
	TUNISIA("TN", "Tunisia"),
	TONGA("TO", "Tonga"),
	EASTTIMOR("TP", "East Timor"),
	TURKEY("TR", "Turkey"),
	TRINIDADTOBAGO("TT", "Trinidad and Tobago"),
	TUVALU("TV", "Tuvalu"),
	TAIWAN("TW", "Taiwan"),
	TANZANIA("TZ", "Tanzania, United Republic of"),
	UKRAINE("UA", "Ukraine"),
	UGANDA("UG", "Uganda"),
	MINOROUTLYING("UM", "United States Minor Outlying Islands"),
	UNITEDSTATES("US", "United States"),
	URUGUAY("UY", "Uruguay"),
	UZBEKISTAN("UZ", "Uzbekistan"),
	HOLYSEE("VA", "Holy See (Vatican City State)"),
	GRENADINES("VC", "Saint Vincent and the Grenadines"),
	VENEZUELA("VE", "Venezuela"),
	VIRGINBritish("VG", "Virgin Islands, British"),
	VIRGIN("VI", "Virgin Islands, U.S."),
	VIETNAM("VN", "Vietnam"),
	VANUATU("VU", "Vanuatu"),
	WALLISFUTUNA("WF", "Wallis and Futuna"),
	SAMOA("WS", "Samoa"),
	YEMEN("YE", "Yemen"),
	MAYOTTE("YT", "Mayotte"),
	YUGOSLAVIA("YU", "Yugoslavia"),
	SOUTHAFRICA("ZA", "South Africa"),
	ZAMBIA("ZM", "Zambia"),
	ZAIRE("ZR", "Zaire"),
	ZIMBABWE("ZW", "Zimbabwe"),
	ANONYMOUS("A1", "Anonymous Proxy"),
	SATELLITE("A2", "Satellite Provider"),
	UNKONWN("unknown", "unknown"),
	OTHER("O1", "Other");

	private String code;
	private String name;

	private NationType(String code, String name) {
		this.code = code;
		this.name = name;
	}
	
	public static List<Map<String, String>> getList(String q) {
		List<Map<String, String>> list = new LinkedList<Map<String, String>>();
		for (NationType type : NationType.values()) {
			if (StringUtils.isNotBlank(q)) {
				if (type.getCode().toLowerCase().contains(q.toLowerCase()) || type.getName().toLowerCase().contains(q.toLowerCase())) {
					Map<String, String> map = new HashMap<String, String>();
					map.put("code", type.getCode());
					map.put("name", type.getName());
					list.add(map);
				}
			} else {
				Map<String, String> map = new HashMap<String, String>();
				map.put("code", type.getCode());
				map.put("name", type.getName());
				list.add(map);
			}
		}
		return list;
	}

	/**
	 * Fetch instance by code.
	 * 
	 * @param code
	 * @return
	 */
	public static NationType instanceOf(String code) {
		for (NationType dateType : NationType.values()) {
			if (StringUtils.equals(dateType.getCode(), code)) {
				return dateType;
			}
		}

		return NationType.UNKONWN;
	}

	/**
	 * @return the code
	 */
	public String getCode() {
		return code;
	}

	/**
	 * @param code
	 *            the code to set
	 */
	public void setCode(String code) {
		this.code = code;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
}
jquery autocomplete插件由于每次用户输入都需要检索后台所以下面是控制层的代码。

        @ResponseBody
	@RequestMapping(value = "nationtype.xxx")
	public List<Map<String, String>> getInsertInfo(@RequestParam("q") String q) {
		return NationType.getList(q);
	}
最后是前端代码。

<input type="text" id="nationType" name="nationType" />

(function($) {
	Class('Xxx.xxxMain',{
		init:function() {
			this.opt ={rootId:"#root"};
			this.root = $(this.opt.rootId);
			this.initAutoComplete();
		},
		initAutoComplete: function() {
			var acOptions = {
				minChars : 0,
				max : 10,
				mustMatch : true,
				cacheLength : 1,
				multiple : false,
				autoFill : true,
				formatItem: function (row, i, max) {
				    return row.code + " [" + row.name + "]";
				},
				formatResult: function (row, i, max) {
					return row.code;
				}
			};
			$("#nationType").autocomplete("/nationtype.nhn",acOptions);
		},
	});
})(jQuery);
效果图如下。
效果图


Jquery-Autocomplete属性说明
属性 类型 说明
minChars Number 在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表
width Number 指定下拉框的宽度. Default: input元素的宽度
max Number autoComplete下拉显示项目的个数.Default: 10
delay Number 击键后激活autoComplete的延迟时间(单位毫秒).Default: 远程为400 本地10
autoFill Boolean 要不要在用户选择时自动将用户当前鼠标所在的值填入到input框. Default: false
mustMatch Booolean 如果设置为true,autoComplete只会允许匹配的结果出现在输入框,所有当用户输入的是非法字符时将会得不到下拉框.Default: false
matchContains Boolean 决定比较时是否要在字符串内部查看匹配,如ba是否与foo bar中的ba匹配.使用缓存时比较重要.不要和autofill混用.Default: false
selectFirst Boolean 如果设置成true,在用户键入tab或return键时autoComplete下拉列表的第一个值将被自动选择,尽管它没被手工选中(用键盘或鼠标).当然如果用户选中某个项目,那么就用用户选中的值. Default: true
cacheLength Number 缓存的长度.即对从数据库中取到的结果集要缓存多少条记录.设成1为不缓存.Default: 10
matchSubset Boolean autoComplete可不可以使用对服务器查询的缓存,如果缓存对foo的查询结果,那么如果用户输入foo就不需要再进行检索了,直接使用缓存.通常是打开这个选项以减轻服务器的负担以提高性能.只会在缓存长度大于1时有效.Default: true
matchCase Boolean 比较是否开启大小写敏感开关.使用缓存时比较重要.如果你理解上一个选项,这个也就不难理解,就好比foot要不要到FOO的缓存中去找.Default: false
multiple Boolean 是否允许输入多个值即多次使用autoComplete以输入多个值. Default: false
multipleSeparator String 如果是多选时,用来分开各个选择的字符. Default: ","
scroll Boolean 当结果集大于默认高度时是否使用卷轴显示 Default: true
scrollHeight Number 自动完成提示的卷轴高度用像素大小表示 Default: 180
formatItem Function 为每个要显示的项目使用高级标签.即对结果中的每一行都会调用这个函数,返回值将用LI元素包含显示在下拉列表中. Autocompleter会提供三个参数(row, i, max): 返回的结果数组, 当前处理的行数(即第几个项目,是从1开始的自然数), 当前结果数组元素的个数即项目的个数. Default: none, 表示不指定自定义的处理函数,这样下拉列表中的每一行只包含一个值.
formatResult Function 和formatItem类似,但可以将将要输入到input文本框内的值进行格式化.同样有三个参数,和formatItem一样.Default: none,表示要么是只有数据,要么是使用formatItem提供的值.
formatMatch Function 对每一行数据使用此函数格式化需要查询的数据格式. 返回值是给内部搜索算法使用的. 参数值row
extraParams Object 为后台(一般是服务端的脚本)提供更多的参数.和通常的作法一样是使用一个键值对对象.如果传过去的值是{ bar:4 },将会被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假设当前用户输入了foo). Default: {}
result handler 此事件会在用户选中某一项后触发,参数为:event: 事件对象. event.type为result.data: 选中的数据行.formatted:formatResult函数返回的值.例如:$("#singleBirdRemote").result(function(event, data, formatted) {});//如选择后给其他控件赋值,触发别的事件等等





猜你喜欢

转载自blog.csdn.net/xiaoyao880609/article/details/51132963