zTree保持展开单一路径之简易实现

zTree是一款非常不错的树型插件,在以往的学习和最近的开发中都用到了,具有丰富和友好的接口。但保持展开单一路径不是通过配置实现的(ext是通过配置实现的,这样看上去更简单),而需要单独的代码实现(也许是为了更多的灵活性),官方给出的示例可以在这里查看。本文在其基础上对代码进行了修改,使其更加简洁,以满足自己的需求(可能考虑得不周全,请读者指证),以下是的具体实现:

实现思路:

在当前节点展开前折叠与当前节点处于同一级别的其它节点,这样就能保证同一级别中只有一个节点是展开的,实现单一路径展开。

实现代码:

functionsinglePath(currNode){
	varcLevel=currNode.level;
	//这里假设id是唯一的
	varcId=currNode.id;
	
	//此对象可以保存起来,没有必要每次查找
	vartreeObj=$.fn.zTree.getZTreeObj("treeDemo");
	//展开的所有节点,这是从父节点开始查找(也可以全文查找)
	varexpandedNodes=treeObj.getNodesByParam("open",true,currNode.getParentNode());

	for(vari=expandedNodes.length-1;i>=0;i--){
		varnode=expandedNodes[i];
		varlevel=node.level;
		varid=node.id;
		if(cId!=id&&level==cLevel){
			treeObj.expandNode(node,false);
		}
	}
}

完整示例:

<!DOCTYPEhtml>
<HTML>
<HEAD>
	<TITLE>ZTREEDEMO-singlepath</TITLE>
	<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
	<linkrel="stylesheet"href="../../../css/demo.css"type="text/css">
	<linkrel="stylesheet"href="../../../css/zTreeStyle/zTreeStyle.css"type="text/css">
	<scripttype="text/javascript"src="../../../js/jquery-1.4.4.min.js"></script>
	<scripttype="text/javascript"src="../../../js/jquery.ztree.core-3.4.js"></script>
	<!--<scripttype="text/javascript"src="../../../js/jquery.ztree.excheck-3.4.js"></script>
	<scripttype="text/javascript"src="../../../js/jquery.ztree.exedit-3.4.js"></script>-->
	<SCRIPTtype="text/javascript">
		<!--
		varsetting={
			view:{
				dblClickExpand:true,showLine:true
			},data:{
				simpleData:{
					enable:true
				}
			},callback:{
				beforeExpand:beforeExpand
			}
		};

		varzNodes=[
			{id:1,pId:0,name:"根1Root"},{id:11,pId:1,name:"父节点1-1"},{id:111,pId:11,name:"叶子节点1-1-1"},{id:1111,pId:111,name:"叶子节点1-1-1-1"},{id:1112,name:"叶子节点1-1-1-2"},{id:1113,name:"叶子节点1-1-1-3"},{id:112,name:"叶子节点1-1-2"},{id:1121,pId:112,name:"叶子节点1-1-2-1"},{id:1122,name:"叶子节点1-1-2-2"},{id:1123,name:"叶子节点1-1-2-3"},{id:113,name:"叶子节点1-1-3"},{id:114,name:"叶子节点1-1-4"},{id:12,name:"父节点1-2"},{id:121,pId:12,name:"叶子节点1-2-1"},{id:1211,pId:121,name:"叶子节点1-2-1-1"},{id:1212,name:"叶子节点1-2-1-2"},{id:1213,name:"叶子节点1-2-1-3"},{id:122,name:"叶子节点1-2-2"},{id:1221,pId:122,name:"叶子节点1-2-2-1"},{id:1222,name:"叶子节点1-2-2-2"},{id:1223,name:"叶子节点1-2-2-3"},{id:123,name:"叶子节点1-2-3"},{id:124,name:"叶子节点1-2-4"},{id:2,name:"根2Root"},{id:21,pId:2,name:"父节点2-1"},{id:211,pId:21,name:"叶子节点2-1-1"},{id:212,name:"叶子节点2-1-2"},{id:213,name:"叶子节点2-1-3"},{id:214,name:"叶子节点2-1-4"},{id:22,name:"父节点2-2"},{id:221,pId:22,name:"叶子节点2-2-1"},{id:222,name:"叶子节点2-2-2"},{id:223,name:"叶子节点2-2-3"},{id:224,name:"叶子节点2-2-4"}
		];

functionbeforeExpand(treeId,treeNode){
	singlePath(treeNode);
}

functionsinglePath(currNode){
	varcLevel=currNode.level;
	//这里假设id是唯一的
	varcId=currNode.id;
	
	//此对象可以保存起来,没有必要每次查找
	vartreeObj=$.fn.zTree.getZTreeObj("treeDemo");
	//展开的所有节点,这是从父节点开始查找(也可以全文查找)
	varexpandedNodes=treeObj.getNodesByParam("open",false);
		}
	}
}

$(document).ready(function(){
	$.fn.zTree.init($("#treeDemo"),setting,zNodes);
});
//-->
</SCRIPT>
<styletype="text/css">
.ztreelibutton.switch{visibility:hidden;width:1px;}
.ztreelibutton.switch.roots_docu{visibility:visible;width:16px;}
.ztreelibutton.switch.center_docu{visibility:visible;width:16px;}
.ztreelibutton.switch.bottom_docu{visibility:visible;width:16px;}
</style>
</HEAD>

<BODY>
<h1>保持展开单一路径</h1>
<h6>[文件路径:super/singlepath.html]</h6>
<divclass="content_wrap">
	<divclass="zTreeDemoBackgroundleft">
		<ulid="treeDemo"class="ztree"></ul>
	</div>
	<divclass="right">
		<ulclass="info">
			<liclass="title"><h2>实现方法说明</h2>
				<ulclass="list">
				<li>此Demo是在"单击展开/折叠节点"基础上改造而来,树节点保持始终只展开一条路径。</li>
				<liclass="highlight_red">利用setting.callback.beforeExpand/onExpand事件回调函数实现展开规则</li>
				</ul>
			</li>
		</ul>
	</div>
</div>
</BODY>
</HTML>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结