使用 Bootstrap Typeahead 组件(自动补全)
2013-11-28 16:11 阅读(234)

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>