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.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
jQuery选择器之属性筛选选择器用法详解
Sep 19 jQuery
jquery ztree实现右键收藏功能
Nov 20 jQuery
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
JS文件中加载jquery.js的实例代码
May 05 jQuery
jQuery实现表单动态添加数据并提交的方法
Jul 19 jQuery
菊花转动的jquery加载动画效果
Aug 19 jQuery
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
[jQuery] 事件和动画详解
Mar 05 jQuery
jQuery 隐藏/显示效果函数用法实例分析
May 20 jQuery
jQuery实现的分页插件完整示例
May 26 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
PHP使用者状态管理功能的应用
2006/10/09 PHP
也谈截取首页新闻 - 范例
2006/10/09 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
Laravel下生成验证码的类
2017/11/15 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
拖动时防止选中
2017/02/03 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
python opencv实现图像配准与比较
2021/02/09 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
成品库仓管员岗位职责
2014/04/06 职场文书