ct_autocompleter.js 3.3 KB
/**
 * 自己写一个自动补全
 */
var ct_autocompleter = (function () {

    var maxItem = 10;

    var init = function (wrap, searchFun) {
        var input = $('input', wrap);

        //var data = gb_o_s_basic_data.findAllPerson();
        //input事件
        input.on('input', function () {
            var list = [],
                v = $(this).val();

            if(!v){
                cancel(wrap);
                return;
            }

            var list = searchFun(v);
            showRsList(list, wrap);
        });
        $(wrap).append('<div class="ct_autocompleter"><ul class="item-list"></ul></div>');

        wrap = $('.ct_autocompleter', wrap);
        $(wrap).on('mouseenter', '.item-list>li.item', function () {
            $('li.item.active', wrap).removeClass('active');
            $(this).addClass('active');
        });
        //事件
        input.on('keydown', function (e) {
            if(e.keyCode == 13){
                var atItem = $('li.item.active', wrap);
                if(atItem.length > 0){
                    input.val(atItem.text());
                    cancel(wrap);
                    return;
                }
            }
            moveFocus(e, wrap)
        });

        //选中
        $(wrap).on('click', '.item-list>li.item', function () {
            input.val($(this).text());
            cancel(wrap);
        });
    };

    var cancel = function (wrap) {
        $('.item-list', wrap).empty();
        $(wrap).hide();
    };

    var showRsList = function (list, wrap) {
        var htmlStr = '';
        for(var i=0,v;v=list[i++];){
            htmlStr += '<li class="item">'+v+'</li>';
        }
        $('.item-list', wrap).html(htmlStr);
        $(wrap).show();
    };

    var moveFocus = function (e, wrap) {
        if(e.keyCode != 38 && e.keyCode != 40)
            return;

        var ca = $('li.item.active', wrap)
            , i = 0
            , max;

        if(ca.length > 0){
            i = ca.index() + 1;
            max = $('li.item', wrap).length;

            if(i >= max)
                i = 0;
        }

        $('li.item.active', wrap).removeClass('active');
        $('.item-list>li:eq('+i+')', wrap).addClass('active');
    };

    var initPerson = function (wrap) {
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = gb_o_s_basic_data.findAllPerson(),
                list = [];

            for(var i=0,p;p=data[i++];){

                if(list.length >= maxItem)
                    break;
                if(p.name.indexOf(v) != -1
                    || p.code.indexOf(v) != -1
                    || p.fc.indexOf(v) != -1
                    || p.cc.indexOf(v) != -1){
                    list.push(p.code + '/' + p.name);
                }
            }

            return list;
        });
    };


    var initBus = function (wrap) {
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = gb_o_s_basic_data.findAllBus(),
                list = [];

            for(var i=0,nbbm;nbbm=data[i++];){

                if(list.length >= maxItem)
                    break;
                if(nbbm.indexOf(v) != -1)
                    list.push(nbbm);
            }

            return list;
        });
    };

    return {
        initPerson : initPerson,
        initBus: initBus
    }
})();