php + Bootstrap-v3-Typeahead 自动完成组件的使用

Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,类似百度、谷歌等搜索提示;输入关键词出现相应的下拉列表数据。

是Bootstrap-3-Typeahead,不是Twitter open source的typeahead,两者用法有差异。外加如果配合原生的Bootstrap3 的话推荐还是用这个。(当然Twitter open source也有个bootstrap)。

1、基于Bootstrap v3 版本的 typeahead

 第一,简单使用:

 首先,最简单的使用方式,就是直接在标记中声明,通过 data-provide="typeahead" 来声明这是一个 typeahead 组件,通过 data-source= 来提供数据。当然了,你还必须提供 bootstrap-typeahead.js 脚本。

<html>
<head>
    <meta charset="utf-8"/>
    <link href="./bootstrap.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script>

    <form  class="navbar-form navbar-left" role="search" target="_blank" method="get" action="">
        <div class="form-group">
            <!--第一种方法-->
            <input  type="text" data-provide="typeahead" data-source='["Deluxe Bicycle", "Super Deluxe Trampoline", "Super Duper Scooter"]'>
        </div>
        <button type="submit" class="btn"  >搜索</button>
    </form>
</body>
</html>

  第二,支持 Ajax 获取数据

  注意,我们提供了一个 source 函数来提供数据,这个函数接收两个参数,第一个参数 query 表示用户的输入,第二个参数是 process 函数,这个 process 函数是 typeahead 提供的,用来处理我们的数据。

  如果你希望通过 Ajax 调用从服务器端获取匹配的数据,那么,在异步完成的处理函数中,你需要获取一个匹配的字符串数组,然后,将这个数组作为参数,调用 process 函数。

<html>
<head>
    <meta charset="utf-8"/>
    <link href="./bootstrap.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script>

    <form  class="navbar-form navbar-left" role="search" target="_blank" method="get" action="">
        <div class="form-group">
            <!--第一种方法-->
            <!--<input >-->
            <input type="text"  name="keys" class="form-control"  data-provide="typeahead" data-value="" autocomplete="off" placeholder="请输入要搜索关键词">
        </div>
        <button type="submit" class="btn"  >搜索</button>
    </form>
    <script>
        /***第二种方法****************************************/
        console.log("欢迎使用typeahead");
        /***第一种形式******返回json串***********************/
        $('#product_search').typeahead({
            source: function (query, process) {
                return $.ajax({
                    url: './server.php',
                    type: 'post',
                    data: { query: query },
                    dataType: 'json',
                    success: function (result) {
                        var resultList = result.map(function (item) {
                            var aItem = { id: item.id, name: item.name };
                            return JSON.stringify(aItem);
                        });
                        return process(resultList);

                    }
                });
            },
            matcher: function (obj) {
                var item = JSON.parse(obj);
                return ~item.name.toLowerCase().indexOf(this.query.toLowerCase())
            },
            sorter: function (items) {          
               var beginswith = [], caseSensitive = [], caseInsensitive = [], item;
                while (aItem = items.shift()) {
                    var item = JSON.parse(aItem);
                    if (!item.name.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(JSON.stringify(item));
                    else if (~item.name.indexOf(this.query)) caseSensitive.push(JSON.stringify(item));
                    else caseInsensitive.push(JSON.stringify(item));
                }
                return beginswith.concat(caseSensitive, caseInsensitive)
            },
            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>'
                })
            },
            updater: function (obj) {
                var item = JSON.parse(obj);
                $('#product_search').attr('data-value', item.id);
                return item.name;
            },
            delay:500,
            minLength:1,
            items: 10,   //显示10条
            delay: 0,  //延迟时间
        });
        
        /**第二种形式*****返回json串**********************************/
        jQuery('#product_search').typeahead({
            source: function (query, process) {
                //query是输入值
                jQuery.getJSON('./server.php', { "query": query }, function (data) {
                    process(data);
                });
            },
            highlighter: function (item) {
                var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
                return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
                    return '<strong >' + match + '</strong>'
                })
            },
            updater: function (item) {
                return item
            },
            afterSelect: function (item) {
                //选择项之后的时间,item是当前选中的项
                $("#product_search").attr("data-value",item.id);
            },
            delay:500,
            minLength:1,
            items: 10,   //显示10条
            delay: 0,  //延迟时间
        });
    </script>
</body>
</html>

  服务器处理文件 server.php

<?php
    //1、 先获取当前搜索词"query"
    //2、 从数据库中查询此字段的热词集合
    //3、 从数据库中检索出包含此搜索词的热词集合,并按搜索次数排序,将数据返回给typeahead.js
    if(!empty($_GET)){
        $data = array();
        $data[0]['id'] = 0;
        $data[0]['name'] = "aaaaa";
        $data[1]['id'] = 1;
        $data[1]['name'] = "aaaaabbbbbb";
        $data[2]['id'] = 2;
        $data[2]['name'] = "aaaaaabbbbbccccc";
    }else{
        $data = array();
        $data[0]['id'] = 0;
        $data[0]['name'] = "baidu";
        $data[1]['id'] = 1;
        $data[1]['name'] = "baidu2";
        $data[2]['id'] = 2;
        $data[2]['name'] = "baidu3";
    }
    echo json_encode($data);die;

文件链接及打包地址: 

      ajax两种形式都支持: 

      bootstrap-3-typeahead cdn

      ajax只支持第二种形式的 typeahead组件: 

      自动补全插件-bootstrap-3-typeahead

      或 https://www.twitterbootstrapmvc.com/Documentation#typeahead 该 bootstrap.typeahead.min.js

      demo打包地址:链接:http://pan.baidu.com/s/1geQ0DVX 密码:83vn

      

参考资料: 使用 Bootstrap Typeahead 组件 - 冠军 - 博客园

      Bootstrap typeahead使用问题记录及解决方案

      Bootstrap typeahead ajax result format - Example [结果格式的例子引导Typeahead Ajax] - 问题-字节技术

      typeahead Bloodhound完整例子

2、Twitter typeahead+bootstrap 官网用法:

  typeahead的官方主页:http://twitter.github.io/typeahead.js/

  typeahead的官方Example:http://twitter.github.io/typeahead.js/examples/

参考资料:  使用bootstrap typeahead插件

       Twitter bootstrap模糊查询插件