layui的tree组件搜索功能

参考 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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值