基于zTree的常用成员管理树图级联选择(防穿梭框功能)

广州这几天的天气异常寒冷,前几天搞一个系统需要实现菜单管理,而菜单管理页则需要涉及到给用户授权访问菜单,因此需要选择相应的可访问成员,之前在基于elementui的后台管理系统中用过它的树图组件,觉得挺不错的,因此决定自己封装一个jquery的ztree成员管理树图,在这淘宝双十二的夜晚,闲暇之余记录下自己的学习点滴------------前言

源码地址:https://github.com/applebring/zTree-plugin

运行:目前为静态数据,直接运行index.html即可

插件功能:可实现对左侧树图节点的搜索,可实现选择左侧树图成员到右侧框中,可实现右侧数据的删除,可实现数据的初始化

基本界面如下:

直接上代码,注释也已经很清晰

HTML:

<BODY>
	<h1>基于zTree树部门成员选择器插件</h1>
	<div class="content_wrap">
		<div class="zTreeDemoBackground left">
			<div class="input-search">
				<input type="text" placeholder="输入关键字查询" id="filter-text" class="empty" /><span style="color:red;font-size:12px;position:absolute;left:0;right:0;top:40px;display:none;" class="no-data">查找不到结果~</span>
			</div>
			<div class="tree-content">
				<ul id="treeDemo" class="ztree"></ul>
			</div>
		</div>
		<div class="right">
			<ul class="choose-content">
			</ul>
		</div>
	</div>
	<script type="text/javascript" src="./resources/libs/jQuery/jquery-2.2.3.min.js"></script>
	<script type="text/javascript" src="./resources/libs/zTree_v3/js/jquery.ztree.core.js"></script>
	<script type="text/javascript" src="./resources/libs/zTree_v3/js/jquery.ztree.excheck.js"></script>
	<script type="text/javascript" src="./resources/libs/zTree_v3/js/dir-tree.js"></script>
</BODY>

JAVASCRIPT(ps:搜索关键字可根据需要搜索zNode相应字段,本次搜索是通过name字段搜索,如需搜索到父级文字可搜索zNodes中的searchdata字段)

	$(function () {
			page.init();
		});
		var page = (function () {
			var treeInit = function () {
				/*
				渲染数组到右侧
				arr:  渲染的数组
				*/
				function renderData(arr) {

				}
				/*主要功能:将点击事件与checked事件关联,判断是否最后一个元素,如果是,将最后一个元素放入渲染数组,再将数组渲染到右侧
				eventjs event 对象
				treeIdString  对应 zTree 的 treeId,便于用户操控
				treeNodeJSON  被点击的节点 JSON 数据对象
				*/
				function checkChangeFn(event, treeId, treeNode) {
					var rightArr = [];
					var checkedNode = zTree.getCheckedNodes(true);
					$.each(checkedNode, function (i, item) {
						if (!item.isParent) {/*item.isLastNode判断结点是否为最后一个结点*/
							rightArr.push(item);
						}
					});
					var rhtml = "";
					$.each(rightArr, function (i, item) {
						rhtml += "<li data-item='" + JSON.stringify(item) + "'><span>" + item.name + "</span><span class='close'>x</span></li>";
					});
					$(".choose-content").html(rhtml);
				}
				/*
				高亮样式设置
				*/
				function getFontCss(treeId, treeNode) {
					return (!!treeNode.highlight) ? { color: "#A60000", "font-weight": "bold" } : { color: "#333", "font-weight": "normal" };
				}
				var setting = {
					check: {
						enable: true
					},
					data: {
						simpleData: {
							enable: true
						}
					},
					view: {
						fontCss: getFontCss
					},
					callback: {
						onClick: function (event, treeId, treeNode) {
							//将点击事件与复选框事件关联
							var zTree = $.fn.zTree.getZTreeObj("treeDemo");
							zTree.checkNode(treeNode, !treeNode.checked, true);
							checkChangeFn(event, treeId, treeNode);
							var curSelect = $("#treeDemo").find(".curSelectedNode");//控制选中项背景样式
							treeNode.checked == true ? (curSelect.hasClass("unactive") ? curSelect.removeClass("unactive") : '') : curSelect.addClass("unactive");
						},
						onCheck: checkChangeFn
					}
				};
				var zNodes = [
					{ id: 1, pId: 0, name: "集团", open: true, checked: false,searchdata:"集团" },
					{ id: 11, pId: 1, name: "一汽", open: true, checked: false,searchdata:'集团一汽' },
					{ id: 111, pId: 11, name: "一汽子成员1", checked: false,searchdata:'集团一汽一汽子成员1' },
					{ id: 112, pId: 11, name: "一汽子成员2", checked: false,searchdata:'集团一汽一汽子成员2' },
					{ id: 12, pId: 1, name: "二汽", open: true, checked: false,searchdata:'集团二汽' },
					{ id: 121, pId: 12, name: "二汽子成员1", checked: false,searchdata:'集团二汽二汽子成员1' },
					{ id: 122, pId: 12, name: "二汽子成员2", checked: false,searchdata:'集团二汽二汽子成员2' },
					{ id: 2, pId: 0, name: "集团 2", checked: true, open: true,searchdata:'' },
					{ id: 21, pId: 2, name: "一汽", checked: true,searchdata:'' },
					{ id: 22, pId: 2, name: "二汽", open: true, checked: false,searchdata:'' },
					{ id: 221, pId: 22, name: "二汽1", checked: true,searchdata:'' },
					{ id: 222, pId: 22, name: "二汽2", checked: true,searchdata:'' },
					{ id: 23, pId: 2, name: "三汽", checked: false,searchdata:'' }
				];
				$.fn.zTree.init($("#treeDemo"), setting, zNodes);
				var zTree = $.fn.zTree.getZTreeObj("treeDemo");
				//初始化数据,调用树图check事件
				zTree.setting.callback.onCheck();
				//清空搜索框内容
				$("#filter-text").val("");
			};
			//组件初始化;
			var componentInit = function () {
				//右侧选框删除事件
				$(".choose-content").on("click", ".close", function () {
					var tId = $(this).parent("li").data("item").tId;
					var zTree = $.fn.zTree.getZTreeObj("treeDemo");
					//通过id找到节点,改变状态
					zTree.checkNode(zTree.getNodeByTId(tId), false, true);
					//移除元素
					$(this).parent("li").remove();
				});
				/*
				搜索树节点,如果找到则高亮显示,没找到提示
				*/
				function updateNodes(highlight, nodeList) {
					var zTree = $.fn.zTree.getZTreeObj("treeDemo");
					if($("#filter-text").val()!=""){zTree.expandAll(false);}//先折叠所有节点,再展开相应的节点
					for (var i = 0, l = nodeList.length; i < l; i++) {
						nodeList[i].highlight = highlight;
						zTree.expandNode(nodeList[i].getParentNode(), true, false, false); //将搜索到的节点的父节点展开
						zTree.updateNode(nodeList[i]);
					}
				}
				function searchNode() {
					var filter = $("#filter-text").val();
					var zTree = $.fn.zTree.getZTreeObj("treeDemo");
					var filterArr = zTree.getNodesByParamFuzzy("name", filter, null);;
					if (filter === ""){updateNodes(false,filterArr);$(".no-data").css("display","none");return;};
					if(filter!=""&&filterArr.length==0){$(".no-data").css("display","block");}else{$(".no-data").css("display","none");}
					updateNodes(true, filterArr);
				}
				/*输入框添加输入监听*/
				$("#filter-text").on("propertychange", searchNode).on("input", searchNode);
			};
			return {
				init: function () {
					treeInit();
					componentInit();
				}
			}
		})();

由于最近项目也赶,手头活多,这是个不规范的插件,自己后续将进一步将其按照插件规范封装成一个规范插件,完善并更新到git上,要是需要用到的朋友请直接到git上下载源码运行~如有错误之处,也欢迎指出~要是有感兴趣的朋友想封装下,也欢迎来互相交流下~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章