Bootstrap 的 Typeahead 插件是个自动补全功能插件,类似于JQuery UI Autocomplete 插件。功能很强大,但是,早期的版本问题很多,使用很不方便。建议大家下载最新的修订版本。
下载地址:https://github.com/tcrosen/twitter-bootstrap-typeahead
使用上很简单, 主要的设置就是数据源(source),即搜索的源数据。
第一,使用简单的对象数组
使用$('选择器').typeahead(...)方法来创建插件,方法内需要传入一个参数对象。通常情况下,只需要设置source参数即可:
<html> <head> <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="js/bootstrap-typeahead.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#demo1').typeahead({ source: [ { id: 1, name: 'Toronto' }, { id: 2, name: 'Montreal' }, { id: 3, name: 'New York' }, { id: 4, name: 'Buffalo' }, { id: 5, name: 'Boston' }, { id: 6, name: 'Columbus' }, { id: 7, name: 'Dallas' }, { id: 8, name: 'Vancouver' }, { id: 9, name: 'Seattle' }, { id: 10, name: 'Los Angeles' } ] }); }) </script> </head> <body> <h3 style="display:inline-block;">搜索:</h3><input id="demo1" type="text"/> </body> </html>默认情况下会自动使用name属性值,当然我们也可以通过display参数来主动设置:
<html> <head> <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="js/bootstrap-typeahead.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#demo1').typeahead({ source: [ { name: 'Toronto' ,address:'北京' }, { name: 'Montreal' ,address:'上海' }, { name: 'New York',address:'广州' }, { name: 'Buffalo' ,address:'深圳' }, { name: 'Boston' ,address:'南京' }, { name: 'Columbus' ,address:'福建' }, { name: 'Dallas' ,address:'重庆' }, { name: 'Vancouver' ,address:'天津' }, { name: 'Seattle' ,address:'北京' }, { name: 'Los Angeles' ,address:'北京' } ], display: 'address' }); }) </script> </head> <body> <h3 style="display:inline-block;">搜索:</h3><input id="demo1" type="text"/> </body> </html>
第二,使用source 函数(适用于旧版中)
使用source函数我们可以动态的生成源数据,尤其是获取远端的数据源。
这个函数接收两个参数,第一个参数 query 表示用户的输入,第二个参数是 process 函数,这个 process 函数是 typeahead 提供的,通过它可以将动态生成的数据传给typeahead 。
<html> <head> <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="js/bootstrap-typeahead.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#demo1').typeahead({ source:function(query, process){ $.ajax({ url: '/typeahead/sources', type: 'get', dataType: 'json', async: true, success: function(data){ process(data); } }); } }); }) </script> </head> <body> <h3 style="display:inline-block;">搜索:</h3><input id="demo1" type="text"/> </body> </html>服务器端:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("["); out.println("\"Toronto\", \"Seattle\" "); out.println("]"); out.flush(); out.close(); }
简单的写了个servlet(因为我是做java的)。 注意这里返回的不能是对象数组,只能是字符串数组。
注:由于在新版中专门提供了ajax的支持,所以此方法不能使用了, 这里只是说明下对于旧版的使用。
第三,Ajax 获取数据
这是修订版中新增的支持,这样我们就不用再手写获取数据源的代码,只需设置到相应的参数即可:
<html> <head> <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="js/bootstrap-typeahead.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#demo1').typeahead({ ajax: { url: '/typeahead/sources', triggerLength: 1, method: 'post', preProcess: function(data) { // 必需的, 功能类似于process()方法 //将json字符串转为json对象 return $.parseJSON(data); } } }); }) </script> </head> <body> <h3 style="display:inline-block;">搜索:</h3><input id="demo1" type="text"/> </body> </html>
其中triggerLength参数设置搜索框触发的字符数, 默认为3.
服务器端:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("["); out.println("{ \"id\": 1, \"name\": \"Toronto\" },"); out.println("{ \"id\": 9, \"name\": \"Seattle\" }"); out.println("]"); out.flush(); out.close(); }有一点需要注意,高版本的jquery(1.5还是1.6我记不清了)对json的格式严格限制, 所以返回的json对象的属性必须是双引号,不能是单引号。
highlighter的使用
使用highlighter 函数可以对匹配的项目进行二次处理,生成符合需要的值。
以下是typeahead的默认实现,item 是匹配的项目,找到匹配的部分之后,使用 <strong> 加粗了。
highlighter: function (item) { var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { return '<strong>' + match + '</strong>'; }); },我们可以对这个函数进行重写:
<html> <head> <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="js/bootstrap-typeahead.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#demo1').typeahead({ source: [ { id: 1, name: 'Toronto' }, { id: 2, name: 'Montreal' }, { id: 3, name: 'New York' }, { id: 4, name: 'Buffalo' }, { id: 5, name: 'Boston' }, { id: 6, name: 'Columbus' }, { id: 7, name: 'Dallas' }, { id: 8, name: 'Vancouver' }, { id: 9, name: 'Seattle' }, { id: 10, name: 'Los Angeles' } ], highlighter: function (item) { return '<strong>----' + item + '----</strong>' } }); }) </script> </head> <body> <h3 style="display:inline-block;">搜索:</h3><input id="demo1" type="text"/> </body> </html>
