easyui Tree模拟级联勾选cascadeCheck,节点选择,父节点自动选中,节点取消,父节点自动取消选择,节点选择,所有子节点全部选择,节点取消,所有子节点全部取消勾选

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

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

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

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

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

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


1

2

3

4

5

6

7

8

9

$.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事件中会用到。

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

$(‘#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的小软件啊,推荐一下呗。

原文地址:https://www.cnblogs.com/wangluochong/p/9374927.html

时间: 2024-08-04 23:11:28

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

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

原创: EasyUI  Tree 最后一级 节点 横向排列 转载请指明出处 必须要写在: onLoadSuccess 事件中 ddAuthTree.tree({ lines: true, checkbox: true, cascadeCheck: true, lines: false, url: authTreeUrl, onLoadSuccess:function(node,data){ ddAuthTree.find("ul >li:not(:has(ul))").css('

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

需求:EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中 效果: /**   * 给树增加onCheck事件,首先使用cascadeCheck:false属性禁止全选,   * 然后获取当前选中节点的所有子节点,在判断其拥有子节点时对其所有字节点   * 进行遍历操作.在easyui中树节点的是否选中不是由checked:true   * 属性来控制,而是由class tree-checkbox0   * 和tree-checkbox1进行控制.--by wk   */  

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

写一个树控件并没有想象中的那么容易,今天又花了我一个1个多小时,主要为IT小鲜肉 Widgets Tree控件添加了 单选.多选.选择前和选择后两个回调函数.获取选中节点的功能.后面会继续努力完善这个树控件. 1.通过设置初始化时候的选项{select:true}开启单选,通过设置初始化时候的选项{select:{type:'multiple'}}开启多选 使用实例代码如下: 运行效果如下: 2.添加了onBeforeSelect回调函数,用来实现自定义选择,如果该函数返回false会中断默认的

EasyUI Tree判断节点是否是叶

方法1:  $('#domaincatalog').tree('isLeaf', node.target); 返回true或false ,true表示是叶节点, false即不是 方法2:官方文档中:看到每个节点都有一些属性,其中一个是state,我们就通过这个state来判断.state有两个值 open和closed表示当前节点 打开和关闭了树的状态.当state等于undefined的时候就表示当前节点是Leaf 叶了. 在tree的onclick事件上添加判断代码如下 $("#domai

easyui tree 级联从三种状态变为两种状态

在网上找的方法都是使用方法$('#tree').tree('select', node.target);都没绕开oncheck方法,后来发现easyui tree提供了一个update方法可以成功绕开onCheck方法,从而成功将级联改为两种状态.代码如下: $('#tree').tree({ url: '/tree' ,lines:false ,checkbox:true ,cascadeCheck: false ,onCheck: function (node, checked) { blC

JQuery EasyUi Tree获取所有checkbox选中节点的id和内容

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>    <head>        <meta name="generator" content="HTML Tidy, see www.w3.org">      

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

Easyui Tree一直就没有提供这个方法,以前没有用到,所以一直没怎么在意,这次自己用到了,顺便扩展了一个方法,分享给大家. $.extend($.fn.tree.methods, { getLevel:function(jq,target){ var l = $(target).parentsUntil("ul.tree","ul"); return l.length+1; } }); 用法: var node = $().tree("getSele

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

Easyui Tree一直就没有提供这个方法,以前没有用到,所 以一直没怎么在意,这次自己用到了,顺便扩展了一个方法,分享给大家. $.extend($.fn.tree.methods, { getLevel:function(jq,target){ var l = $(target).parentsUntil("ul.tree","ul"); return l.length+1; } }); 用法: var node = $().tree("getSel

Jquery easyui tree的使用

这个ui用的一切都是json数据.树也是如此! 后台需要返回与格式匹配的json数据才能正确加载树. 页面定义一个ui: <ul id="messageInfoAddTree" class="easyui-tree" checkbox="true" data-options="lines:true" style="height:94%"></ul> JS访问后台: //人员树 $('