jQuery EasyUI tree增加搜索功能的实现方法


Posted in jQuery onApril 27, 2017

扩展jQuery EasyUI tree搜索树节点的方法,使其支持节点名称的模糊匹配,将不匹配的节点隐藏。

/**
 * 1)扩展jquery easyui tree的节点检索方法。使用方法如下:
 * $("#treeId").tree("search", searchText);   
 * 其中,treeId为easyui tree的根UL元素的ID,searchText为检索的文本。
 * 如果searchText为空或"",将恢复展示所有节点为正常状态
 */
(function($) { 
  $.extend($.fn.tree.methods, {
    /**
     * 扩展easyui tree的搜索方法
     * @param tree easyui tree的根DOM节点(UL节点)的jQuery对象
     * @param searchText 检索的文本
     * @param this-context easyui tree的tree对象
     */
    search: function(jqTree, searchText) {
      //easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
      var tree = this;
      //获取所有的树节点
      var nodeList = getAllNodes(jqTree, tree);
      //如果没有搜索条件,则展示所有树节点
      searchText = $.trim(searchText);
      if (searchText == "") {
        for (var i=0; i<nodeList.length; i++) {
          $(".tree-node-targeted", nodeList[i].target).removeClass("tree-node-targeted");
          $(nodeList[i].target).show();
        }
        //展开已选择的节点(如果之前选择了)
        var selectedNode = tree.getSelected(jqTree);
        if (selectedNode) {
          tree.expandTo(jqTree, selectedNode.target);
        }
        return;
      }
      //搜索匹配的节点并高亮显示
      var matchedNodeList = [];
      if (nodeList && nodeList.length>0) {
        var node = null;
        for (var i=0; i<nodeList.length; i++) {
          node = nodeList[i];
          if (isMatch(searchText, node.text)) {
            matchedNodeList.push(node);
          }
        }
        //隐藏所有节点
        for (var i=0; i<nodeList.length; i++) {
          $(".tree-node-targeted", nodeList[i].target).removeClass("tree-node-targeted");
          $(nodeList[i].target).hide();
        }      
        //折叠所有节点
        tree.collapseAll(jqTree);
        //展示所有匹配的节点以及父节点      
        for (var i=0; i<matchedNodeList.length; i++) {
          showMatchedNode(jqTree, tree, matchedNodeList[i]);
        }
      }  
    },
    /**
     * 展示节点的子节点(子节点有可能在搜索的过程中被隐藏了)
     * @param node easyui tree节点
     */
    showChildren: function(jqTree, node) {
      //easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
      var tree = this;
      //展示子节点
      if (!tree.isLeaf(jqTree, node.target)) {
        var children = tree.getChildren(jqTree, node.target);
        if (children && children.length>0) {
          for (var i=0; i<children.length; i++) {
            if ($(children[i].target).is(":hidden")) {
              $(children[i].target).show();
            }
          }
        }
      }  
    },
    /**
     * 将滚动条滚动到指定的节点位置,使该节点可见(如果有滚动条才滚动,没有滚动条就不滚动)
     * @param param {
     *  treeContainer: easyui tree的容器(即存在滚动条的树容器)。如果为null,则取easyui tree的根UL节点的父节点。
     *  targetNode: 将要滚动到的easyui tree节点。如果targetNode为空,则默认滚动到当前已选中的节点,如果没有选中的节点,则不滚动
     * } 
     */
    scrollTo: function(jqTree, param) {
      //easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
      var tree = this;
      //如果node为空,则获取当前选中的node
      var targetNode = param && param.targetNode ? param.targetNode : tree.getSelected(jqTree);
      if (targetNode != null) {
        //判断节点是否在可视区域        
        var root = tree.getRoot(jqTree);
        var $targetNode = $(targetNode.target);
        var container = param && param.treeContainer ? param.treeContainer : jqTree.parent();
        var containerH = container.height();
        var nodeOffsetHeight = $targetNode.offset().top - container.offset().top;
        if (nodeOffsetHeight > (containerH - 30)) {
          var scrollHeight = container.scrollTop() + nodeOffsetHeight - containerH + 30;
          container.scrollTop(scrollHeight);
        }              
      }
    }
  });
  /**
   * 展示搜索匹配的节点
   */
  function showMatchedNode(jqTree, tree, node) {
    //展示所有父节点
    $(node.target).show();
    $(".tree-title", node.target).addClass("tree-node-targeted");
    var pNode = node;
    while ((pNode = tree.getParent(jqTree, pNode.target))) {
      $(pNode.target).show();      
    }
    //展开到该节点
    tree.expandTo(jqTree, node.target);
    //如果是非叶子节点,需折叠该节点的所有子节点
    if (!tree.isLeaf(jqTree, node.target)) {
      tree.collapse(jqTree, node.target);
    }
  }  
  /**
   * 判断searchText是否与targetText匹配
   * @param searchText 检索的文本
   * @param targetText 目标文本
   * @return true-检索的文本与目标文本匹配;否则为false.
   */
  function isMatch(searchText, targetText) {
    return $.trim(targetText)!="" && targetText.indexOf(searchText)!=-1;
  }
  /**
   * 获取easyui tree的所有node节点
   */
  function getAllNodes(jqTree, tree) {
    var allNodeList = jqTree.data("allNodeList");
    if (!allNodeList) {
      var roots = tree.getRoots(jqTree);
      allNodeList = getChildNodeList(jqTree, tree, roots);
      jqTree.data("allNodeList", allNodeList);
    }
    return allNodeList;
  }
  /**
   * 定义获取easyui tree的子节点的递归算法
   */
  function getChildNodeList(jqTree, tree, nodes) {
    var childNodeList = [];
    if (nodes && nodes.length>0) {       
      var node = null;
      for (var i=0; i<nodes.length; i++) {
        node = nodes[i];
        childNodeList.push(node);
        if (!tree.isLeaf(jqTree, node.target)) {
          var children = tree.getChildren(jqTree, node.target);
          childNodeList = childNodeList.concat(getChildNodeList(jqTree, tree, children));
        }
      }
    }
    return childNodeList;
  }
})(jQuery);

以上所述是小编给大家介绍的jQuery EasyUI tree增加搜索功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

jQuery 相关文章推荐
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
jQuery常用选择器详解
Jul 17 jQuery
简单实现jQuery轮播效果
Aug 18 jQuery
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
jQuery使用each遍历循环的方法
Sep 19 jQuery
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 jQuery
jQuery实现颜色打字机的完整代码
Mar 19 jQuery
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
JS/jquery实现一个网页内同时调用多个倒计时的方法
Apr 27 #jQuery
jQuery使用正则验证15/18身份证的方法示例
Apr 27 #jQuery
jQuery鼠标悬停内容动画切换效果
Apr 27 #jQuery
使用jQuery,Angular实现登录界面验证码详解
Apr 27 #jQuery
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 #jQuery
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 #jQuery
jquery.form.js异步提交表单详解
Apr 25 #jQuery
You might like
真正的ZIP文件操作类(php)
2007/07/21 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
js编写选项卡效果
2017/05/23 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
计算机专业应届生求职信
2014/04/06 职场文书
代收款委托书范本
2014/10/01 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
先进事迹材料范文
2014/12/29 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript