参考 layui 岁月神偷的代码,做了一些修改。
直接复制代码,修改layui的文件路径即可看到效果
具体可参考 https://fly.layui.com/jie/46865/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>layui.tree搜索</title>
<link rel="stylesheet" href="./src/css/layui.css">
<style>
.search_hint_text {
color: red;
}
.treeDom::before {
content: attr(data-no_search_hint_text);
text-align: center;
display: block;
width: 100%;
}
</style>
</head>
<body class="body">
<input type="text" class="ipt">
<div class="treeDom" id="treeDom" style="width: 300px;max-height: 300px;overflow: auto;border:1px solid #ccc"></div>
<script src="./jquery-1.9.1.min.js"></script>
<script src="./src/layui.js"></script>
<script>
/**
* @param fn {Function} 实际要执行的函数
* @param delay {Number} 延迟时间,也就是阈值,单位是毫秒(ms)
* @return {Function} 返回一个“去弹跳”了的函数
*/
function debounce(fn, delay) {
var timer;
return function () {
var context = this;
var args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args)
}, delay);
};
}
layui.use(["tree"], function () {
var $ = layui.jquery;
var tree = layui.tree;
layui.tree.syncLayuiTreeFilter = function syncLayuiTreeFilter(treeId, filter, callback) {
// console.time('加载时间')
var treeElem = $('.' + treeId), filterElem = $(filter);
if (!filterElem.length || !filterElem.length) {
return;
}
var that = filterElem;
var value = $.trim($(that).val());
var HIDE = 'layui-hide';
var hintClass = 'search_hit';
var hintClassWrap = 'search_hit_wrap';
// 先恢复现场 如果节点默认没有箭头,则不删除class “layui-hide”
var hideElem = treeElem.find('.' + HIDE);
hideElem.each(function (index, item) {
$(item) && !$(item).hasClass('layui-tree-iconArrow') && $(item).removeClass(HIDE);
})
treeElem.find("." + hintClassWrap).removeClass(hintClassWrap);
treeElem.find('.' + hintClass).removeClass(hintClass).each(function (index, item) {
item = $(item);
item.html(item.data('textOld')).data('textOld', null);
});
treeElem.attr('data-no_filter_results', '');
// 如果有值筛选开始
if (value) {
layui.each(treeElem.find('.layui-tree-entry'), function (index, treeElem) {
var elem = $(treeElem);
var textTemp = elem.text();
if (textTemp.indexOf(value) === -1) {
// 不存在就隐藏
elem.closest('div').addClass(HIDE);
} else {
// 命中就添加一个class
elem.find('.layui-tree-txt').addClass(hintClass)
.data('textOld', textTemp)
.html(textTemp.replace(new RegExp(value, 'g'), '<span class="search_hint_text">' + value + '</span>'));
}
});
layui.each(treeElem.find('.' + hintClass), function (index, treeElem) {
var elem = $(treeElem);
var parentElem = elem.parents('div').parent('div').prev();
//展示父节点
parentElem.removeClass(HIDE);
elem.parents('div').parent('div').addClass(hintClassWrap)
//展示子节点 //在搜索值为中间级别的时候,搜索结果会导致叶子节点的图标变成"+",未解决
// elem.parents('div').parent('div').next().children('div').children('div').siblings().removeClass(HIDE);
//将节点展开
if (parentElem.find(".layui-tree-addition")) {
parentElem.find(".layui-tree-addition").click();
}
});
// 如果没有符合条件的选项,设置暂无数据
if (treeElem.find('.' + hintClass).length == 0) {
treeElem.addClass('no_filter_results');
treeElem.attr('data-no_filter_results', '暂无数据')
}
// console.timeEnd('加载时间')
}
// 默认展开所有符合条件的节点
treeElem.find('.' + hintClassWrap).each(function () {
console.log($(this));
$(this).hasClass("layui-tree-set") && !$(this).hasClass("layui-tree-spread") && $($(this).children("div").get(0)).find('.layui-tree-iconClick').click()
})
treeElem[0].scrollTop = 0;
typeof callback === 'function' && callback.call(that, treeElem, filterElem, treeElem.find('.' + hintClass).length);
// });
};
var params = [
{
title: '常用文件夹'
, id: 1
, alias: 'changyong'
, children: [
{
title: '所有未读(设置跳转)'
, id: 11
, href: 'http://www.layui.com/'
, alias: 'weidu'
}, {
title: '置顶邮件'
, id: 12
}, {
title: '邮件标签邮件'
, id: 13
}
]
}, {
title: '我的邮箱'
, id: 2
, spread: true
, children: [
{
title: 'QQ邮箱'
, id: 21
, spread: true
, children: [
{
title: '收件箱'
, id: 211
, children: [
{
title: '所有未读'
, id: 2111
}, {
title: '置顶邮件'
, id: 2112
}, {
title: '标签邮件'
, id: 2113
}
]
}, {
title: '已发出的邮件'
, id: 212
}, {
title: '垃圾邮件'
, id: 213
}
]
}, {
title: '阿里云邮'
, id: 22
, children: [
{
title: '收件箱'
, id: 221
}, {
title: '已发出的邮件'
, id: 222
}, {
title: '垃圾邮件'
, id: 223
}
]
}
]
}
, {
title: '收藏夹'
, id: 3
, alias: 'changyong'
, children: [
{
name: '爱情动作片'
, id: 31
, alias: 'love'
}, {
name: '技术栈'
, id: 12
, children: [
{
name: '前端'
, id: 121
}
, {
name: '全端'
, id: 122
}
]
}
]
}
]
layui.tree.render({
elem: '.treeDom'
, data: params
, onlyIconControl: true //是否仅允许节点左侧图标控制展开收缩
, showLine: false
, showCheckbox: false // 是否展示多选框
, accordion: true
, id: 'treeDom'
, click: function (obj) {
console.log(obj);
$('.ipt').val(obj.data.title)
}
});
$('input').on('keyup', debounce(function (e) {
tree.syncLayuiTreeFilter('treeDom', $(this), function (treeElem, filterElem, hitNumbers) {
console.log('hitNumbers', hitNumbers);
layer.msg('找到' + hitNumbers + '个节点');
});
}, 500))
})
</script>
</body>
</html>