先上代码。

        var IDMark_Switch = "_switch",
IDMark_Icon = "_ico",
IDMark_Span = "_span",
IDMark_Input = "_input",
IDMark_Check = "_check",
IDMark_Edit = "_edit",
IDMark_Remove = "_remove",
IDMark_Ul = "_ul",
IDMark_A = "_a"; var setting = {
check: {
enable: true,
chkboxType: { "Y": "", "N": "" }
},
callback: {
onCheck: onCheck
}
}; var zNodes =[
{id:1, name:"hover事件显示控件", open:true,
children:[
{id:11, name:"按钮1"},
{id:12, name:"按钮2"},
{id:13, name:"下拉框"},
{id:141, name:"文本1"},
{id:142, name:"文本2"},
{id:15, name:"超链接"} ]},
{id:2, name:"始终显示控件", open:true,
children:[
{id:21, name:"按钮1"},
{id:22, name:"按钮2"},
{id:23, name:"下拉框"},
{id:24, name:"文本"},
{id:25, name:"超链接"}
]}
]; function onCheck(e, treeId, treeNode) {
var flagBoolean
// 从没有点击 到 点击 flagBoolean 1
// 从点击 到 没有点击 flagBoolean 2
// 都不是 flagBoolean 0 // console.log(e)
// console.log(treeId)
// console.log(treeNode) // ?
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
// var node = zTree.getNodeByParam("id",fileSucessdData[0].rid);
// zTree.selectNode(node); var nodes = zTree.getChangeCheckedNodes(); // console.log(nodes[0]) for (var n in nodes) {
if (nodes[n].checked && !nodes[n].checkedOld) {
flagBoolean = 1
} else if (!nodes[n].checked && nodes[n].checkedOld) {
flagBoolean = 2
} else {
flagBoolean = 0
}
nodes[n].checkedOld = nodes[n].checked
} // console.log(nodes) var node = nodes[0] var aObj = $("#" + node.tId + IDMark_A); console.log(aObj) if (flagBoolean === 1) {
if ($("#diyBtn_"+treeNode.id).length>0) return;
var editStr = "<input id='diyBtn_" +treeNode.id+ "' title='"+treeNode.name+"' />";
aObj.after(editStr);
var btn = $("#diyBtn_"+treeNode.id);
} else if (flagBoolean === 2) {
if (treeNode.parentTId && treeNode.getParentNode().id!=1) return;
$("#diyBtn_"+treeNode.id).unbind().remove();
$("#diyBtn_space_" +treeNode.id).unbind().remove();
} // aObj.click(); // $("#"+node.tId+"_span").click();
// end
} $(document).ready(function(){
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});

讲一下这个是怎么实现的。

首先是 zTree.getChangeCheckedNodes() 方法的坑。

API说:

获取输入框勾选状态被改变的节点集合(与原始数据 checkedOld 对比)。[setting.check.enable = true 时有效]

请通过 zTree 对象执行此方法。

但是API还说:

如果需要获取每次操作后全部被改变勾选状态的节点数据,请在每次勾选操作后,遍历所有被改变勾选状态的节点数据,让其 checkedOld = checked 就可以了。

所以,需要在方法中手动设置一下checkedOld。

            for (var n in nodes) {
nodes[n].checkedOld = nodes[n].checked
}

这样,触发方法时,才会是 只有改变check状态的节点对象进入 nodes 集合。

然后,我们需要记录一下状态:它是从没选中到选中了,还是从选中了到没选中?

            var flagBoolean
// 从没有点击 到 点击 flagBoolean 1
// 从点击 到 没有点击 flagBoolean 2
// 都不是 flagBoolean 0 var zTree = $.fn.zTree.getZTreeObj("treeDemo"); var nodes = zTree.getChangeCheckedNodes(); for (var n in nodes) {
if (nodes[n].checked && !nodes[n].checkedOld) {
flagBoolean = 1
} else if (!nodes[n].checked && nodes[n].checkedOld) {
flagBoolean = 2
} else {
flagBoolean = 0
}
nodes[n].checkedOld = nodes[n].checked
}

最后,把别的DEMO里添加和销毁自定义DOM的 代码粘过来就行了。

            if (flagBoolean === 1) {
if ($("#diyBtn_"+treeNode.id).length>0) return;
var editStr = "<input id='diyBtn_" +treeNode.id+ "' title='"+treeNode.name+"' />";
aObj.after(editStr);
var btn = $("#diyBtn_"+treeNode.id);
} else if (flagBoolean === 2) {
if (treeNode.parentTId && treeNode.getParentNode().id!=1) return;
$("#diyBtn_"+treeNode.id).unbind().remove();
$("#diyBtn_space_" +treeNode.id).unbind().remove();
}

以上。

ztree : checkbox 选中/不选中时动态添加/删除DOM元素的更多相关文章

  1. 用Javascript动态添加删除HTML元素实例 (转载)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. jquery给动态添加的dom元素绑定事件

    $('input').click(function () { //处理代码 }); 这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定,对于页面中动态添加的元素,在页面加载完成后 ...

  3. Angularjs学习笔记2_添加删除DOM元素

    1.调用element方法     angular.element(html) 把字符串或dom对象转化成一JQuery对象, angular.element(document.getElementB ...

  4. Jquery each() 如何操作动态添加的DOM元素

    JQ each页面上的DOM元素的时候,如果有一部分的DOM是ajax异步加载的,那么each可能遍历不到元素,异步请求数据的同时不会影响后面的代码执行,今天就遇到这个问题了, 解决方案是讲ajax改 ...

  5. angular.js ng-repeat动态插入删除dom节点

    既然上面提到 angular.js 下无需用户直接操作dom ,而是在编译间断 dom 与 控制层model 实现了双向绑定,一方做出改变,另一方就会立即改变,那问题来了,我想插入一个文本框和按钮,并 ...

  6. angular.js 动态插入删除dom节点

    angular.js 是新一代web开发框架,它轻松在web前端实现了MVC模式,相比 jquery 模式,这种新玩意竟然不需要开发者直接去操作dom . 作为前端开发而不去操作dom ,这简直是一个 ...

  7. SpringBoot运行时动态添加数据源

    此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...

  8. javascript实现的动态添加表单元素input,button等(appendChild)

    写一个小系统时,需要动态添加表单元素,按自己的实现方法写了这篇教程! 我想各位在很多网站上都看到过类似的效果! 1.先用document.createElement方法创建一个input元素! 代码如 ...

  9. 编辑 Ext 表格(一)——— 动态添加删除行列

    一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除.   (1) 动态添加表格的行  gridS ...

随机推荐

  1. C# 什么是泛型 ?以及对泛型各方面的一些知识点的整理

    1.1 理解什么是泛型 在.NET 2.0,可以成为革命性壮举的, 就是引入了激动人心的特性——泛型..NET泛型是CLR和高级语言共同支持的一种全新的结构,实现了一种将类型抽象化的通用处理方式.在泛 ...

  2. 这一次搞懂Spring Web零xml配置原理以及父子容器关系

    前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...

  3. Spring 中Controller 获取请求参数的方法笔记

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...

  4. (二)、JAVA运行时数据区域

    根据<Java 虚拟机规范(Java SE 7版)>规定,Java虚拟机所管理的内存,将会包括以下几个运行时数据区域: 注: 1.由所有线程共享的数据区: 对应 java内存模型的主内存, ...

  5. windows 64位上安装mysql 5.7版本

    下载的mysql不是安装exe的软件,而是在windows上编译好的二进制mysql软件 下载安装之后配置环境变量:将目录D:\Program Files\mysql-5.7.18-winx64\my ...

  6. 弹性盒模型中flex-grow 和flex的区别

    在flex弹性盒模型体系中,flex-grow和flex都有对子元素进行放大的作用,但是这两个属性在放大时的计算方法不同,在使用时候要注意,使用正确的放大属性,从而达到自己想要的效果. 先来看下两个属 ...

  7. Centos7 GRE Tunnel

    一.关闭防火墙及selinux 二.CentOS7默认不加载gre内核模块,加载gre内核模块 # modprobe ip_gre   临时加载gre模块(重启后失效) # lsmod |grep g ...

  8. 无题II HDU - 2236 【二分图+二分答案】

    题目 这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. Input 输入一个整数T表示T组数据. 对于每组数据第一行输入一 ...

  9. 洛谷 P1186 【玛丽卡】

    这道题题目真的想吐槽一下...是在机房同学的解释下才看懂的.就是让你求在可以删一条边的情况下,并且删后保证可以到达终点时,求删了后的最大的最短路径. 70分暴力思路: 枚举删边,然后跑一下最短路即可, ...

  10. angular弹出对话框结构

    angular dialog标准结构,注意有checkbox时,需要外包一层div,checkbox-wrapper类的这个样式控制了不显示滚动条.