【Bootstrap】 typeahead自动补全
typeahead
这篇文章记录了我在使用typeahead的一些问题,不是很全,但是基本够用。
Bootstrap提供typeahead组件来完成自动补全功能。
两种用法:
直接给标签添加属性
<input type="text" data-provide="typeahead">
通过设置autocomplete="off"来关闭浏览器自带的自动补全功能,以防跟我们的产生冲突。
通过JavaScript
调用$('.typeahead').typeahead()
typeahead()详解
参考官方README和其他一些博客的资料,可以了解typeahead函数可以接受的一些参数,这些参数可以通过指定标签属性来传递,也可以直接在JavaScript中给出。对于标签属性传递参数来说,需要在参数前加上data-,例如data-source="".
下表为官方README文档中参数表格的翻译版本:
Name | Type | Default | Description |
source | array, function | [] |
用来查询的数据源。可以是数组或字符串,一个带有name属性的JSON对象的数组集合,或者一个函数。函数可以接受两个参数,query代表输入框中你的输入值(即查询值),process回调函数。The function may be used synchronously by returning the data source directly or asynchronously via the |
items | number | 8 | 下拉选项中出现条目的最大数量。也可以设置为“all” |
minLength | number | 1 | 出发下拉提示的最小长度字符串。可以设置为0,即使没有填写任何内容,也会出现提示。 |
showHintOnFocus | boolean or "all" | false | 当输入框获得焦点时立刻显示提示。如果设置为true,显示所有匹配项。如果设置为“all”,显示所有提示,并不会按照当前文本过滤。当你需要一个组合框(Combo Box,由文本框和下拉框组成)功能时,可以考虑这个。 |
scrollHeight | number, function | 0 | Number of pixels the scrollable parent container scrolled down (scrolled out the viewport). |
matcher | function | case insensitive | 该函数用来确定匹配条目的规则。接受一个参数,item用于测试查询字符串是否匹配。通过当前查询字符串this.query。如果相匹配则返回true |
sorter | function | exact match, case sensitive, case insensitive |
该函数用来对结果进行排序。接受一个参数items并且具有typeahead实例的作用域,通过this.query得到当前查询。 |
updater | function | returns selected item | 该函数用来返回选中的条目。接受一个item参数并且具有typeahead实例的作用域。 |
highlighter | function | highlights all default matches | 用来高亮自动补全的结果。接受一个item参数并且拥有typeahead实例的作用域。应该返回html |
displayText | function | item.name || item | 用来得到数据源的条目的文本表示。接受一个item参数并且拥有typeahead实例的作用域。应该返回一个字符串。 |
autoSelect | boolean | true | 允许你决定是否自动选择第一个建议。关闭它意味着如果没有选择任何内容(或Enter或Tab),输入将不会清空。 |
afterSelect | function | $.noop() | 选择一个条目后的回调函数。It gets the current active item in parameter if any. |
delay | integer | 0 | 在查找之间添加延迟 |
appendTo | jQuery element | null | 默认情况下,菜单将会出现在输入元素的之后。使用这个选项来添加菜单到其他div。如果你想使用bootstrap的dropup或者dropdown-menu-right classes,就不要使用它 |
fitToElement | boolean | false | 如果你希望菜单的大小与其所链接的输入的大小相同,置为true |
addItem | JSON object | false | 在list的最后添加一个条目,例如“New Entry”。这可能被用到,例如当一个条目在数据集中没有被找到的时候,弹出对话框。 |
示例代码
使用静态的内容网上资料很多,直接给source就可以了,更加普遍的需求是:通过aJax动态的查询。
ajax动态查询
$("#search-platform").typeahead({
source: function (query, process) {
return $.ajax({
url: '/domain/xxxx',
type: 'post',
data: {name: query},
success: function (result) {
return process(result);
},
});
}
});
这里我们只使用了一个source选项,指定一下数据源,通过上表我们了解到source可以是一个带有两个参数的函数,其两个参数分别为query和process,query是当前输入框中所输入的内容,process是一个回调函数,它用来将我们得到的结果转换为typeahead组件可以识别的数据。结合上面一段代码,我们返回的内容是通过ajax请求得到的结果,但是这个结果经过了process进行处理。
ajax动态查询,定制显示内容
上面的需求很简单,但是有的时候要考虑更加完善的情况,比方说现在有一个查询框,是用来查询学生姓名的,考虑问题:
学生存在重名情况,我们具体想查询的是学号为001的叫张三的学生,但我们不能输入001,需求就是输入张三,而且查询的时候,一定是根据学号(主键)来查询的,那么我们可以这样显示:
但是如何显示成这种形式,并且我们如何获取后面的学号呢?
1.首先,ajax所访问的后台接口就不能只返回name的字符串数组,而应该返回对象。返回一组Student对象,并且以JSON字符串形式返回。这样前段所接受的内容就是一个JSON对象的集合
2.但是在显示上是有问题的,它将显示为:
我们可以发现几个问题:1.显示格式为JSON字符串,2.如果Student类含有其它属性,那么也会显示出来,除非我们为了这个需求重新设计一个简单对象。
现在考虑解决这几个问题:
1.只保留需要显示/使用的字段
2.显示格式正确,不要JSON格式
3.只能根据姓名检索
source
对于第一个问题,我们需要对数据做预处理,即对ajax获取的数据做处理:
success: function (result) {
var resultList = result.items.map(function (item) {
var aItem = {id: item.id, name: item.name};
return JSON.stringify(aItem);
});
return process(resultList);
}
result是接口返回的JSON数据,我的数据被一个items对象所包裹,所以是result.items.map。
highlighter
前面了解到,highlighter是用来高亮匹配项的,这个高亮可以使用我们自己想要的风格。方法的原始实现也是高亮匹配内容,但是这里不适用,我们希望只显示name:
/**
* 使用指定的方式,高亮(指出)匹配的部分
*
* @param obj 数据源中返回的单个实例
* @returns {XML|void|string|*} 数据列表中数据的显示方式(如匹配内容高亮等)
*/
highlighter: function (obj) {
var item = JSON.parse(obj);
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
return item.name.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>'
});
}
这里反回了html文本,加粗匹配项。这样显示出来的内容就是只有name的情况。但这还不够,你会发现当你选中了一个条目,填充到输入框的内容还是JSON格式。我们还需要重写updater方法:
updater
/**
* 在选中数据后的操作,这里的返回值代表了输入框的值
*
* @param obj
* @return 选中后,最终输入框里的值
*/
updater: function (obj) {
var item = JSON.parse(obj);
return item.name;
}
最终输入框中我们只让他回填name。
这样最终的显示内容就符合了需求,但是当我们提交表单进行查询的时候,还是没有id这个值,这里可能需要一个隐藏域来存放id,我们在updater中将隐藏域的value设置为item.id就可以了。
参考资料:
【Bootstrap】 typeahead自动补全的更多相关文章
- bootstrap - typeahead自动补全插件
$('#Sale').typeahead({ ajax: { url: '@Url.Action("../Contract/GetSale")', //timeout: 300, ...
- typeahead自动补全插件的limit参数问题
遇到的问题很诡异: 后台返回的数据都正确就是显示不正常(有时多有时少),后来发现是typeahead的问题,在1.11版本之后,limit参数从option选项里改到了setdata选项: limit ...
- 使用Bootstrap typeahead插件实现搜索框自动补全的配置参数。
示例代码: <input type="text" id="addr"/> <input type="text" hidde ...
- jquery input 搜索自动补全、typeahead.js
最近做个一个功能需要用到自动补全,然后在网上找了很久,踩了各种的坑 最后用typeahead.js这个插件,经过自己的测试完美实现 使用方法:在页面中引入jquery.jquery.typeahead ...
- angular-ui-bootstrap typeahead 智能提示 自动补全 获取焦点不触发问题的解决
项目中有一处使用了angular-ui-bootstrap中的typeahead来实现输入框智能提示语自动化补全的功能,存在一个bug, 即输入文字后,当再次点击文本框,其获取焦点后并不会触发智能提示 ...
- 自动补全Typeahead
采用 Typeahead (Bootstrap-3-Typeahead-master) <script type="text/javascript" src="/j ...
- bootstrap3-typeahead 自动补全
很酷的一个自动补全插件 http://twitter.github.io/typeahead.js 在bootstrap中使用typeahead插件,完成自动补全 相关的文档:https://gith ...
- bootstrap-typeahead 自动补全简单的使用教程
参考链接: 参考1 : https://segmentfault.com/a/1190000006036166参考2 : https://blog.csdn.net/u010174173/articl ...
- 下拉框、下拉控件之Select2。自动补全的使用
参考链接: 参考一:https://blog.csdn.net/weixin_36146275/article/details/79336158 参考二:https://www.cnblogs.com ...
随机推荐
- android调用plus报错plus is not defined
由于plus 加载需要时间,我们使用plus 的时候应该提前判断是否已经加载好,添加监听 document.addEventListener("plusready",functio ...
- a = a + 1, a++, ++a ,a+=1区别在哪
a = a +1; 即最普通的写法,将a的值加1再赋给a:a+=1; 相当于 a = a+1; a++; 是先将a的值赋给一个变量, 再自增: ++a:是先自增, 再把a的值给一个变量
- [模板] 笛卡尔树 && RMQ
话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡 ...
- 清明培训 清北学堂 DAY2
今天是钟皓曦老师的讲授~~ 总结了一下今天的内容: 数论!!! 1.整除性 2.质数 定义: 性质: 3.整数分解定理——算数基本定理 证明: 存在性: 设N是最小不满足唯一分解定理的整数 (1) ...
- MAGENTO for XAMPP install config -搬家配置与安装配置
MEGENTO . 2.2.3 . 支持 PHP version is 7.0.2|7.0.4|~7.0.6|~7.1.0 虚拟机主机配置 环境扩展配置 其他错误 httpd-conf —— ...
- 了解PID控制
@2019-03-07 [小记] 了解PID控制 比例 - 积分 - 微分 积分 --- 记忆过去 比例 --- 了解现在 微分 --- 预测未来
- Django 2.0.4 微博第三方登录
三方登录逻辑 理解第三方登录的流程: 用户向本地应用商城发起请求,我要用微博进行登录 我们的商城凑一个url让用户跳转到第三方应用的url(微博的登录页面) 用户在该界面点击输入用户名密码之后,点击授 ...
- Android sdk platform,sdk tools,sdk Build tools,sdk platform tools 的关系
1. sdk platform 简单理解为系统版本 最新级别: 28:Android 9 27:Android 8.1 26:Android 8.0 25:Android 7.1 24:Android ...
- Entity Framework入门教程(14)---DbFirst下的存储过程
EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql ...
- 第十五节:深入理解async和await的作用及各种适用场景和用法
一. 同步VS异步 1. 同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...