自定义自动补全标识符
Source
        Output
        QRCode
    <!DOCTYPE html>
<html>
<head>
	<meta charset='utf-8'>
	<title>自定义自动补全标识符</title>
	<link rel="stylesheet" type="text/css" href="//g.alicdn.com/kissy/k/5.0.1/css/base.css">
	<link rel="stylesheet" type="text/css" href="assets/menu.css">
	<link rel="stylesheet" type="text/css" href="assets/menuitem.css">
	<link rel="stylesheet" type="text/css" href="assets/submenu.css">
	<link rel="stylesheet" type="text/css" href="assets/filtermenu.css">
	<style>
        body{
            background: #fff;
        }
        .hasChildren .ks-menuitem-content {
            background: url("http://a.tbcdn.cn/apps/sell/1.0/img/ic_bg.png") no-repeat scroll 500px 500px transparent;
            background-position: 100% -78px;
        }
        .ks-menuitem-selected {
            background-color: #D6EDF4;
            color: #1B4D91;
        }
        .ks-menuitem-hit {
            font-weight: bold;
            color: red;
        }
        .ks-menuitem {
            padding-right: 10px;
        }
    </style>
	<script type="text/javascript" src="//g.alicdn.com/kissy/k/5.0.1/seed-debug.js"></script>
</head>
<body>
	<div class="wrap" style="width:90%;margin:0 auto;">
		<h1>自定义自动补全标识符</h1>
		<h3>操作指南</h3>
		<ol>
		    <li>可在输入框输入中文过滤</li>
		    <li>上下键过滤项间导航</li>
		    <li>输入字后,再输入 ;或 ; 根据当前高亮项进行自动补全</li>
		    <li>点击item可触发click事件</li>
		</ol>
		<h3>从已知元素生成,html结构需要符合规范结构</h3>
		<div id="filterMenuExist"
		     class="ks-filter-menu ks-menu" style="width: 500px">
		    <div class='ks-filter-menu-input-wrap'>
		        <div class="ks-filter-menu-placeholder">请输入</div>
		        <input autocomplete="off" class="ks-filter-menu-input"/>
		    </div>
		    <div class="ks-filter-menu-content" style="height: 200px;overflow: auto;">
		        <div class="ks-menuitem-selectable ks-menuitem">女鞋1</div>
		        <div class="ks-menuitem-selectable ks-menuitem">家居服务2</div>
		        <div class="ks-menuitem-selectable ks-menuitem">手机3</div>
		        <div class="ks-menuitem-selectable ks-menuitem">女鞋4</div>
		        <div class="ks-menuitem-selectable ks-menuitem">家居服务5</div>
		        <div class="ks-menuitem-selectable ks-menuitem">手机6</div>
		        <div class="ks-menuitem-selectable ks-menuitem">女鞋7</div>
		        <div class="ks-menuitem-selectable ks-menuitem">家居服务8</div>
		        <div class="ks-menuitem-selectable ks-menuitem">手机9</div>
		        <div class="ks-menuitem-selectable ks-menuitem">女鞋10</div>
		        <div class="ks-menuitem-selectable ks-menuitem">家居服务11</div>
		        <div class="ks-menuitem-selectable ks-menuitem">手机12</div>
		    </div>
		</div>
	</div>
	
	<script type="text/javascript">
	require(['util','filter-menu'], function(Util, FilterMenu){
		/**
         *  从 html 生成
         */
        var filterMenu = new FilterMenu({
            srcNode: '#filterMenuExist',
            width: 200,
           	allowMultiple : true
        });
        filterMenu.filterItems = function(str){
        	var self = this, prefixCls = self.get('prefixCls'), _placeholderEl = self.get('placeholderEl'), filterInput = self.get('filterInput');    // 有过滤条件提示隐藏,否则提示显示
            // 有过滤条件提示隐藏,否则提示显示
            _placeholderEl[str ? 'hide' : 'show']();
            if (self.get('allowMultiple')) {
                var enteredItems = [], lastWord;    // \uff1b => ;   全角分号unicode编码
                var match = str.match(/(.+)[;\uff1b]\s*([^\uff1b;]*)/);    
                var items = [];
                if (match) {
                    items = match[1].split(/[;\uff1b]/);
                }    
                // 如果可以补全,那么补全最后一项为第一个高亮项
                if (str[str.length-1] == ';' || str[str.length-1] == ';') {
                    enteredItems = [];
                    if (match) {
                        enteredItems = items;    
                        lastWord = items[items.length - 1];
                        var item = self.get('highlightedItem'), content = item && item.get('content');    // 有高亮而且最后一项不为空补全
                        // 有高亮而且最后一项不为空补全
                        if (content && content.indexOf(lastWord) > -1 && lastWord) {
                            enteredItems[enteredItems.length - 1] = content;
                        }
                        filterInput.val(enteredItems.join(';') + ';');
                    }
                    str = '';
                } else {
                    // 需要菜单过滤的过滤词,在最后一个 ; 后面
                    if (match) {
                        str = match[2] || '';
                    }
                    enteredItems = items;
                }
                var oldEnteredItems = self.get('enteredItems');    // 发生变化,长度变化和内容变化等同
                if (oldEnteredItems.length !== enteredItems.length) {
                    self.set('enteredItems', enteredItems);
                }
            }
            var children = self.get('children'), strExp = str && new RegExp(Util.escapeRegExp(str), 'ig'); 
            // 过滤所有子组件
            Util.each(children, function (c) {
                var content = c.get('content');
                if (!str) {
                    // 没有过滤条件
                    // 恢复原有内容
                    // 显示出来
                    c.get('el').html(content);
                    c.set('visible', true);
                } else {
                    if (content.indexOf(str) > -1) {
                        // 如果符合过滤项
                        // 显示
                        c.set('visible', true);    // 匹配子串着重 input-wrap
                        // 匹配子串着重 input-wrap
                        c.get('el').html(content.replace(strExp, function (m) {
                            return '<span class="' + prefixCls + 'menuitem-hit">' + m + '<' + '/span>';
                        }));
                    } else {
                        // 不符合
                        // 隐藏
                        c.set('visible', false);
                    }
                }
            });
        }
        filterMenu.render();
        var selected = null;
        filterMenu.on("click", function (e) {
            if (selected != e.target) {
                selected && selected.set("selected", false);
                selected = e.target;
                alert("selected : " + selected.get("content"));
            }
        });
	})
	</script>
</body>
</html>
         
		