最近项目中用到easyui tree,发现tree控件的cascadeCheck有些坑,不像miniui 的tree控件,级联勾选符合业务需求,所以就自己重新改写了onCheck事件,符合业务需求。网上百度了很多资料,都没有完全符合自己业务场景的,所以就自己动手写咯。

先说一下自己的业务需求:

1.选中节点,上级以及所有直系上级节点自动选中,所有下级子孙节点全部自动选中;

2.取消选择节点,如果兄弟节点都未选择,则上级以及所有直系上级节点自动取消选择,所有下级子孙节点全部取消选中。

这里说一下cascadeCheck属性,tree控件默认cascadeCheck=true,即级联勾选,但这个属性有些坑,当选择某个节点时,如果所有兄弟节点没全部选中,父节点是个方形的,不是勾选,换成勾选,也会有问题。所以索性不用这个cascadeCheck,自己模拟写一个方法。

再说一下tree自定义方法扩展:

$.extend($.fn.tree.methods, {
getLeafChildren: function (jq, params) {
var nodes = [];
$(params).next().children().children("div.tree-node").each(function () {
nodes.push($(jq[0]).tree('getNode', this));
});
return nodes;
}
});

这段代码在后面tree控件onCheck事件中会用到。

好了,废话不多说了,开始上代码:

$('#ulButtonTree').tree({
url:"@Url.Action("GetButtonTree", "Res")",
checkbox:true,
cascadeCheck: false,
onBeforeLoad: function (node, param) {
var node = $('#ulResTree').tree('getSelected');
if (node)
param.ResID = node.ID;
},
onCheck: function (node, checked) {
var tree = $('#ulButtonTree');
if (!eventNode) {//鼠标勾选事件初始化标致,标识鼠标勾选事件第一次遍历开始
eventNode = node;//将鼠标勾选时的节点保存起来,待向下 遍历时,将从此节点开始
treeup = true;//向上遍历标志,由鼠标勾选的节点eventNode开始向上遍历
}
if (treeup) {//向上遍历
var ParentNode = tree.tree("getParent", node.target);
if (ParentNode) {//存在上级节点
if (checked)//如果是选择
tree.tree("check", ParentNode.target);//选中上级节点。注意:如果父节点之前未选中,执行此行代码后,会再次触发onCheck事件,下面的代码暂时不会被执行;如果之前兄弟节点已被选中,那么上级节点也被选中,此行代码执行后不会触发onCheck事件,而直接执行下面的代码
else {//如果是取消选择
var isCheck = false;
var childNode = tree.tree("getLeafChildren", ParentNode.target);
for (var i = 0; i < childNode.length; i++) {//循环当前节点的父节点的所有子节点,及包含当前节点的所有兄弟节点
if (childNode[i].checked) {
isCheck = true;//只要有兄弟节点被选中,则退出循环
break;
}
}
if (!isCheck)//如果所有兄弟节点及当前节点都未勾选,则取消父节点的勾选
tree.tree("uncheck", ParentNode.target);
}
}
treeup = false;//向上遍历结束
}
//到达根部节点或向上遍历结束之后再回到原始节点开始向下遍历
if (!treeup && eventNode) {
var childNode = tree.tree("getChildren", eventNode.target);//获取原始节点eventNode的所有子孙节点
if (checked) {//如果是选择
for (var i = 0; i < childNode.length; i++) {//循环所有子孙节点,全部选中
tree.tree("check", childNode[i].target);
}
}
else {//如果是取消
for (var i = 0; i < childNode.length; i++) {//循环所有子孙节点,全部取消勾选
tree.tree("uncheck", childNode[i].target);
}
}
}
eventNode = null;//标志本次鼠标勾选事件遍历结束
}
});

  好了,看看效果图吧,为了弄这个gif图片,还费了点时间,哈哈,大家有没有好的录制gif的小软件啊,推荐一下呗。

easyui Tree模拟级联勾选cascadeCheck,节点选择,父节点自动选中,节点取消,父节点自动取消选择,节点选择,所有子节点全部选择,节点取消,所有子节点全部取消勾选的更多相关文章

  1. 原创: EasyUI Tree 最后一级 节点 横向排列

    原创: EasyUI  Tree 最后一级 节点 横向排列 转载请指明出处 必须要写在: onLoadSuccess 事件中 ddAuthTree.tree({ lines: true, checkb ...

  2. EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中

    需求:EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中 效果:   /**   * 给树增加onCheck事件,首先使用cascadeCheck:false属性禁止全选,   ...

  3. IT小鲜肉 Widgets Tree 单选、多选、相关回调函数、获取选中的节点功能

    写一个树控件并没有想象中的那么容易,今天又花了我一个1个多小时,主要为IT小鲜肉 Widgets Tree控件添加了 单选.多选.选择前和选择后两个回调函数.获取选中节点的功能.后面会继续努力完善这个 ...

  4. easyui tree扩展tree方法获取目标节点的一级子节点

    Easyui tree扩展tree方法获取目标节点的一级子节点 /* 只返回目标节点的第一级子节点,具体的用法和getChildren方法是一样的 */ $.extend($.fn.tree.meth ...

  5. EasyUI Tree判断节点是否是叶

    方法1:  $('#domaincatalog').tree('isLeaf', node.target); 返回true或false ,true表示是叶节点, false即不是 方法2:官方文档中: ...

  6. easyui复选框树动态加载后台数据,实现自动选中数据库中数据。后台语言是.NET

    最近公司做项目用到了easyui复选框树来实现加载不同类型产品.因为我刚刚毕业,现在也算是实习吧,所以一脸懵逼啊.在公司里的一个哥的帮助下 ,我写出来这个EasyUi复选框树了,虽然东西不难,但也是自 ...

  7. Easyui Tree方法扩展 - getLevel(获取节点级别)

    Easyui Tree一直就没有提供这个方法,以前没有用到,所以一直没怎么在意,这次自己用到了,顺便扩展了一个方法,分享给大家. $.extend($.fn.tree.methods, { getLe ...

  8. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

  9. Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径

    Jquery EasyUI Combotree展开所有父节点 Jquery EasyUI Combotree获取树完整路径 Jquery EasyUI tree展开所有父节点 Jquery EasyU ...

随机推荐

  1. Chrome的Copy Selector中带有\3

    F12,右键copy selector就是这个结果. 查询到如下资料: https://stackoverflow.com/questions/20043347/css-css-coding-that ...

  2. Xshell配置使用linux的图形界面

    1.配置Xshell如下图 2.在命令行中执行"gnome-panel". 3.或者使用xstart,配置如下图:

  3. GDAL——命令使用专题——gdallocationinfo命令

    GDAL——命令使用专题——gdallocationinfo命令  前言 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数 ...

  4. work2:贪吃蛇

    学号:2017*****7219 姓名:邰嘉琛我的码云贪吃蛇项目仓库:https://gitee.com/tjc666/sesnake/tree/master2) 给出你的各项任务完成时间估算与实际消 ...

  5. ROS机器人导航仿真(kinetic版本)

    准备工作: ubuntu 16.04系统;ROS kinetic版本;ROS包turtlebot,导航包rbx1,模拟器arbotix,可视化rviz 1.安装ubuntu 16.04系统与安装ROS ...

  6. vue项目总结

    1.项目的结构

  7. 复制程序到notepad++编辑器出现乱码的解决方法

    1.不从别的编辑器打开的文件中直接复制代码到notepad++打开的文件中,也不从notepad++打开的文件中复制到别的编辑器打开的文件中.但是确实想移植一些代码怎么办呢?具体方法:在别的编译器编辑 ...

  8. ESP32搭建4.esp32官方程序下载与串口读取

    上一篇写到esp-idf的整体环境搭建,本文主要讲讲如何将examples中的例子烧写到ESP32的flash中,以及如何通过linux串口进行调试. 一. Esp32程序下载 1.Ctrl+Alt+ ...

  9. j2ee第五周

    一.AJAX技术 AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.它有机地包含了以下几种 ...

  10. Python字典的使用与处理

    在Python中,字典{dict}是比较常用的一个数据类型,使用键-值(key-value)存储 与列表[list]相比,字典具有极快的查找和插入速度,不会随着key-value的增加而变慢,但是相应 ...