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获取单选按钮radio选中值与去除所有radio选中状态的方法
May 20 jQuery
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
实现jquery放大镜的两种方法
Feb 22 jQuery
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
jQuery中实现text()的方法
Apr 04 jQuery
jQuery实现图片下载代码
Jul 18 jQuery
jQuery-Citys省市区三级菜单联动插件使用详解
Jul 26 jQuery
jQuery鼠标滑过横向时间轴样式(代码详解)
Nov 01 jQuery
js与jquery获取input输入框中的值实例讲解
Feb 27 jQuery
基于JQuery和DWR实现异步数据传递
Oct 16 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
一个显示天气预报的程序
2006/10/09 PHP
php中的数组操作函数整理
2008/08/18 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
Python Paramiko模块的使用实际案例
2018/02/01 Python
python使用mysql的两种使用方式
2018/03/07 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
python基础教程之while循环
2019/08/14 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python输入中文的实例方法
2020/09/14 Python
浅析Python中字符串的intern机制
2020/10/03 Python
2014年小学教师工作自我评价
2014/09/22 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
孔子观后感
2015/06/08 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
Python中for后接else的语法使用
2021/05/18 Python
分析Netty直接内存原理及应用
2021/06/14 Java/Android
Linux中各个目录的作用与内容
2022/06/28 Servers