jQuery ztree实现动态树形多选菜单
我用到的版本ztreecorev3.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> <ulid="treeDemo"class="ztree"style="margin-top:0;width:160px;"> </ul> </div>
js
<scripttype="text/javascript"> $(function(){ $.ajax({ url:'${contextPath}/om/quoteOmRequest.do?flag=init', data:{ name:'1'//随便写的,传入后台的值 }, type:'post', traditional:true, success:function(data){ vardataObj=eval(data); varzTreeObj; varsetting={ data:{ simpleData:{ enable:true, /*idKey:"id", pIdKey:"pId"*/ } }, check:{ enable:true, chkboxType:{"Y":"","N":"s"}//Y:勾选(参数:p:影响父节点),N:不勾(参数s:影响子节点)[p和s为参数,参数都不写""为全不影响] }, callback:{ onCheck: function(){ varzTree=$.fn.zTree.getZTreeObj("treeDemo"); varcheckCount=zTree.getCheckedNodes(true); varclasspurview=""; for(vari=0;i<checkCount.length;i++){ classpurview+=checkCount[i].id+","//存入数据的id,比如这种形式"1,2,5,"后台截取下 } /*alert(classpurview);*/ }, }, view:{ showLine:true, showIcon:true, dblClickExpand:true }, }; varzNodes=dataObj; $(document).ready(function(){ $.fn.zTree.init($("#treeDemo"),setting,zNodes); }); }, error:function(){ alert("异常!"); } }); }); </script>
后台部分可以参考2延迟加载
2、延迟加载ztree
jsp一样的,js有所有区别,这个参考了官方api
<scripttype="text/javascript"> varsetting={ 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, } }; functionfilter(treeId,parentNode,childNodes){ if(!childNodes)returnnull; for(vari=0,l=childNodes.length;i<l;i++){ childNodes[i].name=childNodes[i].name.replace(/\.n/g,'.'); } returnchildNodes; } functionbeforeClick(treeId,treeNode){ if(!treeNode.isParent){ alert("请选择父节点,此节点是根节点..."); returnfalse; }else{ returntrue; } } $(document).ready(function(){ $.fn.zTree.init($("#treeDemo"),setting); }); </script>
后台部分,也包含了1的后台,先看核心代码,这个用的struts,哪个框架都差不多。
Stringflag=request.getParameter("flag"); if(flag.equals("init")){//直接加载ztree List<Inner>list=getTrees();//得到所有节点 try{ convertListToJson(list); }catch(Exceptione){ e.printStackTrace(); } }elseif(flag.equals("ajax")){//延迟加载ztree Stringid=request.getParameter("id"); if(id==null){//第一次进入初始化父节点 List<Inner>list=newArrayList<OmRequestImpl.Inner>(); Innerin1=getById(1); Innerin5=getById(5); list.add(in1); list.add(in5);//测试用的,得到初始化0级父节点,应该从数据库中获取。 try{ convertListToJson(list); }catch(Exceptione){ e.printStackTrace(); } }else{//根据父节点id加载对应的子节点 List<Inner>list=getChilds(Integer.valueOf(id));//通过父id取得子节点集合,测试就自己写个方法,应该从数据库中获取。 try{ convertListToJson(list); }catch(Exceptione){ e.printStackTrace(); } } }
这里涉及了一些方法,我为了测试方便自己写了个测试bean,正式的直接从数据库中获取。下面是bean及一些小方法。
publicclassInner{ privateIntegerid; privateIntegerpId;//指向父节点id privateStringname;//显示的内容 privateStringisParent;//是否是父节点 publicInner(){ this.isParent="false"; } publicStringgetIsParent(){ returnisParent; } publicvoidsetIsParent(StringisParent){ this.isParent=isParent; } publicIntegergetpId(){ returnpId; } publicvoidsetpId(IntegerpId){ this.pId=pId; } publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } } //--将运行结果用json字符返回客户端 publicvoidconvertListToJson(List<?>list)throwsException{ JSONArrayjson=JSONArray.fromObject(list); response.setHeader("Cache-Control","no-cache"); response.setContentType("text/html;charset=UTF-8"); PrintWriterwriter; writer=response.getWriter(); writer.write(json.toString()); writer.close(); }
这些方法可忽略,测试用的,可通过数据库获取
publicList<Inner>getTrees(){ Innerin=newInner(); in.setId(1); in.setpId(0); in.setIsParent("true"); in.setName("父节点1"); Innerin1=newInner(); in1.setId(2); in1.setpId(1); in1.setName("子节点11"); in1.setIsParent("true"); Innerin2=newInner(); in2.setId(3); in2.setpId(1); in2.setName("子节点12"); Innerin3=newInner(); in3.setId(4); in3.setpId(2); in3.setName("子节点111"); Innerin4=newInner(); in4.setId(5); in4.setpId(0); in4.setIsParent("true"); in4.setName("父节点2"); Innerin5=newInner(); in5.setId(6); in5.setpId(5); in5.setName("子节点21"); List<Inner>list=newArrayList<Inner>(); list.add(in); list.add(in1); list.add(in2); list.add(in3); list.add(in4); list.add(in5); returnlist; } publicInnergetById(Integerid){ List<Inner>list=getTrees(); for(Innerinner:list){ if(id==inner.getId()){ Innerin=inner; returnin; } } returnnull; } publicList<Inner>getChilds(Integerid){ List<Inner>list=getTrees(); List<Inner>result=newArrayList<OmRequestImpl.Inner>(); for(Innerinner:list){ if(id.intValue()==inner.getpId().intValue()){ result.add(inner); } } returnresult; }
更多关于ztree控件的内容,请参考专题《jQuery插件ztree使用汇总》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。