我本人写过很多的自动匹配脚本,但是一牵扯到ajax后台调用,总是感觉相当麻烦,这段时间有一个小项目又要用到类似的组件,我痛下决心搞一个好的经过
一下午的比较和使用发现了一个相当不错件那就是
twitter-bootstrap-typeahead-master
这个组件和
bootstrap-typeahead
原装的不太一样,因为原装的对ajax竟然没有支持,如果写的话很费劲,而
twitter-bootstrap-typeahead-master
这个项目则在原版的基础上增加了ajax的功能,着实解决了很多问题,不过这个组件也有不好的地方,就是没有类似于
Jquery插件autocomplete的mustMatch
属性
(如果设置true,autoComplete只会允许匹配的结果出现在输入框,所有当用户输入的是非法字符时将会得不到下拉框),所以经过改造后也实现了这个功能,现在我研究的一些心得与大家分享一下。
首先下载
twitter-bootstrap-typeahead-master
这个组件。
下载地址:
开发前需要版本
- Twitter Bootstrap 2.0+
- jQuery 1.7+
解压后只需要引用如下包即可
<link href="/path/to/bootstrap.css" rel="stylesheet"><script src="/path/to/jquery.js" type="text/javascript"></script><script src="/path/to/bootstrap-typeahead.js" type="text/javascript"></script>
官方的API:
Events
| Event | Description | |
|---|---|---|
| grepper | Filters relevant results from the source. | |
| highlighter | Highlights any matching results in the list. | |
| itemSelected |
| |
| lookup | Determines if source is remote or local and initializes the search. | |
| matcher | Looks for a match between the query and a source item. | |
| render | Renders the list of results. | |
| select | Selects an item from the results list. | |
| sorter | Sorts the results. |
Options
| Name | Type | Default | Description |
|---|---|---|---|
| ajax | object | {
url: null,(1)
timeout: 300,(2)
method: 'post',(3)
triggerLength: 3,(4)
loadingClass: null,
displayField: null,
preDispatch: null,(5)
preProcess: null(6) } | The object required to use a remote datasource. See also: ajax as a string (below) |
| ajax | string | null | Optionally, a simple URL may be used instead of the AJAX object. See also: ajax as an object (above) |
| display | string | 'name' (7) | The object property to match the query against and highlight in the results. |
| item | string | '<li><a href="#"></a></li>' | The HTML rendering for a result item. |
| items | integer | 8 (9) | The maximum number of items to show in the results. |
| menu | string | '<ul class="typeahead dropdown-menu"></ul>' | The HTML rendering for the results list. |
| source | object | [] | The source to search against. |
| val | string | 'id' (8) | The object property that is returned when an item is selected. |
API重点说明
(1) url:顾名思义,需要传一个后台的路径。
(2) timeout: 延时加载
(3) method:提交方式
(4)tiggerLength:输入几个汉字后开始请求后台。
(5)preDispatch:
发出请求前调用的预处理方法
(6)preProcess:发出请求后的调用方式
(7)display:默认的对象属性名称
(8)val:默认的标识属性名称
(9)tiems:下拉列表最多显示几个
前台开发,官方提供的例子比较简单。
$('#demo3').typeahead({
source: [
{ id: 1, full_name: 'Toronto', first_two_letters: 'To' },
{ id: 2, full_name: 'Montreal', first_two_letters: 'Mo' },
{ id: 3, full_name: 'New York', first_two_letters: 'Ne' },
{ id: 4, full_name: 'Buffalo', first_two_letters: 'Bu' },
{ id: 5, full_name: 'Boston', first_two_letters: 'Bo' },
{ id: 6, full_name: 'Columbus', first_two_letters: 'Co' },
{ id: 7, full_name: 'Dallas', first_two_letters: 'Da' },
{ id: 8, full_name: 'Vancouver', first_two_letters: 'Va' },
{ id: 9, full_name: 'Seattle', first_two_letters: 'Se' },
{ id: 10, full_name: 'Los Angeles', first_two_letters: 'Lo' }
],
display: 'full_name'
});
如果不用ajax 其实将数据格式封装成入上代码所示就足够了。
通过阅读源码,我增加并实现了
mustMatch的功能(
只会允许匹配的结果出现在输入框,所有当用户输入的是非法字符时将会得不到下拉框
)。
核心代码的主要思想是:当文本输入框失去焦点的时候,判断当前输入的值,是不是能与下拉列表中的数匹配,如果不匹配则清空,并且高亮显示。(修改后的源码请在文章结尾处获取)
blur: function (e) {var val = this.$element.val();this.focused = falseif(this.uploadData(val)==""){//增加的代码this.$element.css("border","solid red 1px")}else{this.$element.css("border","solid green 1px")}this.$element.val(this.uploadData(val))if (!this.mousedover && this.shown) this.hide()}
具体使用方法如下:
<script type="text/javascript">var data = [{ id: "巴厘岛", name: "巴厘岛" },{ id: "日本", name: "日本" },{ id: "爱尔兰", name: "爱尔兰" },{ id: "北欧", name: "北欧" },{ id: "希腊", name: "希腊" },{ id: "捷克", name: "捷克" },{ id: "意大利", name: "意大利" },{ id: "越南", name: "越南" },{ id: "迪拜", name: "迪拜" },{ id: "斯洛伐克", name: "斯洛伐克" },{ id: "柬埔寨", name: "柬埔寨" },{ id: "马耳代夫", name: "马耳代夫" },{ id: "德法瑞意", name: "德法瑞意" },{ id: "北欧1", name: "北欧1" },{ id: "北欧2", name: "北欧2" }];$(document).ready(function() {$('#search').typeahead({source: data,uploadData:function(item){var arrayData = new Array();$.each(data, function (n, value) {//循环比较arrayData.push(value.name);});var index = $.inArray(item,arrayData);if(index==-1){return ""; //如果不匹配清空}return item; //如果匹配则显示}});});</script>
ajax方式获取后台数据
$("#respondentName").typeahead({ajax: {url: "${ctx}/order/capBusiOrder/listLegalUnit",timeout: 100,displayField: "horsortName",triggerLength: 1,dataType: 'JSON',method: "get",loadingClass: "loading-circle",preDispatch: function (query) {return {horsortName: query, //查询条件limit: 5, //一次只查询5条}},preProcess: function(data) { // 这个方法非常重要!// 本插件要求处理一个javascript对象而不是一个json字符串// 同时应当注意 !return $.parseJSON(data); //非常重要}},display:'horsortName',val:'id',items:5,itemSelected:function(item, value, text) {//alert(item);//object 对象//alert(text); //选中的名称s},uploadData:function(item){//什么都可以通过。不许要做匹配验证则写成如下这种方案return item;}});
修改的代码下载地址如下:
http://download.youkuaiyun.com/detail/ltllml44/9634236
本文介绍了一款增强版的Bootstrap Typeahead插件,该插件新增了ajax支持及mustMatch特性,确保输入框中仅出现有效选项。文中详细解释了配置项与使用方法。
2168

被折叠的 条评论
为什么被折叠?



