自定义自动补全标识符
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>