jQuery ztree实现动态树形多选菜单


Posted in Javascript onAugust 12, 2016

我用到的版本ztree core v3.5.24,需要引入的js,css,jquery.js,jquery.ztree.core.js,jquery.ztree.excheck.js(多选框可选),zTreeStyle.css。
需要注意的指向父节点的pId,我开始写的是pid一开始没注意,默认的是pId,当然可以pIdKey指定自定义的(未测)。还有如果图片没显示肯定是没引入img图片,记得写好路径。

1、先介绍初始化加载ztree

 jsp

<div > 
 <ul id="treeDemo" class="ztree" style="margin-top: 0; width: 160px;"> 
 </ul> 
</div>

js

<script type="text/javascript">
$(function(){
 $.ajax({ 
  url: '${contextPath}/om/quoteOmRequest.do?flag=init',
  data: { 
   name : '1' //随便写的,传入后台的值
  },
  type:'post',
  traditional: true,
  success: function(data){
   var dataObj = eval(data);
   var zTreeObj;
   var setting = {
     data: { 
      simpleData: { 
       enable:true, 
       /* idKey: "id", 
       pIdKey: "pId" */ 
      } 
     },
     check: {
      enable: true,
      chkboxType :{ "Y" : "", "N" : "s" } //Y:勾选(参数:p:影响父节点),N:不勾(参数s:影响子节点)[p 和 s 为参数,参数都不写""为全不影响]
     },
     callback: {
      onCheck: 
        function() { 
         var zTree = $.fn.zTree.getZTreeObj("treeDemo");
         var checkCount = zTree.getCheckedNodes(true);
         var classpurview = "";
         for(var i=0;i<checkCount.length;i++) {
           classpurview += checkCount[i].id+","  //存入数据的id,比如这种形式"1,2,5," 后台截取下
         }
         /* alert(classpurview); */
       } ,
     },
     view: { 
      showLine: true, 
      showIcon: true, 
      dblClickExpand: true 
     }, 
   };
   var zNodes = dataObj; 
   $(document).ready(function(){
    $.fn.zTree.init($("#treeDemo"), setting, zNodes);
   });
  },
  error : function() { 
   alert("异常!"); 
  }
 });
});
</script>

后台部分可以参考2延迟加载

2、延迟加载ztree
jsp一样的,js有所有区别,这个参考了官方api

<script type="text/javascript">
var setting = {
  view: {
   selectedMulti: false
  },
  check: {
   enable: true,
   chkboxType :{ "Y" : "", "N" : "s" } //Y:勾选(参数:p:影响父节点),N:不勾(参数s:影响子节点)[p 和 s 为参数,参数都不写""为全不影响]
  },
  async: {
   enable: true,
   url:"${contextPath}/om/quoteOmRequest.do?flag=ajax",
   autoParam:["id"], 
   dataFilter: filter
  },
  callback: {
   beforeClick: beforeClick,
  }
 };

 function filter(treeId, parentNode, childNodes) {
  if (!childNodes) return null;
  for (var i=0, l=childNodes.length; i<l; i++) {
   childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
  }
  return childNodes;
 }
 function beforeClick(treeId, treeNode) {
  if (!treeNode.isParent) {
   alert("请选择父节点,此节点是根节点...");
   return false;
  } else {
   return true;
  }
 }

 $(document).ready(function(){
  $.fn.zTree.init($("#treeDemo"), setting);
 });
</script>

后台部分,也包含了1的后台,先看核心代码,这个用的struts,哪个框架都差不多。

String flag = request.getParameter("flag");
  if(flag.equals("init")){//直接加载ztree
   List<Inner> list = getTrees();//得到所有节点
   try {
    convertListToJson(list);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }else if(flag.equals("ajax")){//延迟加载ztree
   String id = request.getParameter("id");
   if(id==null){//第一次进入初始化父节点
    List<Inner> list = new ArrayList<OmRequestImpl.Inner>();
    Inner in1=getById(1);
    Inner in5=getById(5);
    list.add(in1);
    list.add(in5);//测试用的,得到初始化0级父节点,应该从数据库中获取。
    try {
     convertListToJson(list);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }else{//根据父节点id加载对应的子节点
    List<Inner> list = getChilds(Integer.valueOf(id));//通过父id取得子节点集合,测试就自己写个方法,应该从数据库中获取。
    try {
     convertListToJson(list);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }

这里涉及了一些方法,我为了测试方便自己写了个测试bean,正式的直接从数据库中获取。下面是bean及一些小方法。

public class Inner{
  private Integer id; 
  private Integer pId; //指向父节点id
  private String name; //显示的内容 
  private String isParent;//是否是父节点
  public Inner(){
   this.isParent="false";
  }
  public String getIsParent() {
   return isParent;
  }
  public void setIsParent(String isParent) {
   this.isParent = isParent;
  }
  public Integer getpId() {
   return pId;
  }
  public void setpId(Integer pId) {
   this.pId = pId;
  }
  public Integer getId() {
   return id;
  }
  public void setId(Integer id) {
   this.id = id;
  }
  public String getName() {
   return name;
  }
  public void setName(String name) {
   this.name = name;
  }
}

// -- 将运行结果用json字符返回客户端
 public void convertListToJson(List<?> list)throws Exception{
   JSONArray json = JSONArray.fromObject(list); 
   response.setHeader("Cache-Control", "no-cache");
   response.setContentType("text/html; charset=UTF-8"); 
   PrintWriter writer;
   writer = response.getWriter();
   writer.write(json.toString());
   writer.close();
 }

这些方法可忽略,测试用的,可通过数据库获取

public List<Inner> getTrees(){
  Inner in=new Inner();
  in.setId(1);
  in.setpId(0);
  in.setIsParent("true");
  in.setName("父节点1");
  Inner in1=new Inner();
  in1.setId(2);
  in1.setpId(1);
  in1.setName("子节点11");
  in1.setIsParent("true");
  Inner in2=new Inner();
  in2.setId(3);
  in2.setpId(1);
  in2.setName("子节点12");
  Inner in3=new Inner();
  in3.setId(4);
  in3.setpId(2);
  in3.setName("子节点111");
  Inner in4=new Inner();
  in4.setId(5);
  in4.setpId(0);
  in4.setIsParent("true");
  in4.setName("父节点2");
  Inner in5=new Inner();
  in5.setId(6);
  in5.setpId(5);
  in5.setName("子节点21");
  List<Inner> list=new ArrayList<Inner>();
  list.add(in);
  list.add(in1);
  list.add(in2);
  list.add(in3);
  list.add(in4);
  list.add(in5);
  return list;
 }
 public Inner getById(Integer id){
  List<Inner> list = getTrees();
  for (Inner inner : list) {
   if(id==inner.getId()){
    Inner in=inner;
    return in;
   }
  }
  return null;
 }
 public List<Inner> getChilds(Integer id){
  List<Inner> list = getTrees();
  List<Inner> result =new ArrayList<OmRequestImpl.Inner>();
  for (Inner inner : list) {
   if(id.intValue()==inner.getpId().intValue()){
    result.add(inner);
   }
  }
  return result;
 }

更多关于ztree控件的内容,请参考专题《jQuery插件ztree使用汇总》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript unicode与GBK2312(中文)编码转换方法
Nov 14 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
Dec 19 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
限制复选框最多选择项的实现代码
May 30 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
Aug 12 #Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 #Javascript
Javascript中的对象和原型(二)
Aug 12 #Javascript
JavaScript中的对象和原型(一)
Aug 12 #Javascript
JavaScript中对象的不同创建方法
Aug 12 #Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 #Javascript
JS+CSS3模拟溢出滚动效果
Aug 12 #Javascript
You might like
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php字符串函数学习之substr()
2015/03/27 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python中字符串对齐方法介绍
2015/05/21 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python列表的逆序遍历实现
2020/04/20 Python
如何写出高性能的JSP和Servlet
2013/01/22 面试题
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
Python中pass语句的作用是什么
2016/06/01 面试题
保护野生动物倡议书
2014/05/16 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
计生专干事迹
2014/05/28 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
食品安全汇报材料
2014/08/18 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
如何做好工作总结!
2019/04/10 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python