首页 > 编程笔记 > JavaScript笔记
阅读:3
jQuery ztree插件的用法(附带实例)
zTree 插件是一款基于 jQuery 实现的多功能“树插件”,优异的性能、灵活的配置、多种功能的组合是 zTree 插件最大的优点。
zTree 插件专门适用于项目开发,尤其是开发树菜单、树数据的Web显示及权限管理等。
zTree 插件的主要特点如下:
【实例】本实例使用 zTree 插件异步加载大数据。程序开发步骤如下:
1) 将 zTree 插件中的 css 文件夹复制到实例文件夹 demo 中。创建一个名为 js 的文件夹,将 jquery-3.6.4.min.js 文件以及 jquery.ztree.core-3.5.js 文件复制到 js 文件夹中。
2) 创建一个名为 index.html 的文件,在该文件的 <head> 标记中引入 jQuery 文件、zTree 插件的核心脚本文件以及 zTree 插件的 CSS 样式文件。代码如下:
3) 在页面的 <body> 标记中创建两个 <ul> 元素,一个用来显示树菜单,另一个用来显示操作日志。代码如下:
4) 编写 jQuery 代码,开启异步加载模式,显示节点上的复选框,使用简单数据模式并设置父节点展开之前、异步加载正常结束时、异步加载出现异常错误时的事件回调函数。具体代码如下:
5) 设置父节点对象。代码如下:
6) 编写函数 getUrl() 用来获取接收页面请求的 URL。代码如下:
7) 编写父节点展开之前、异步加载正常结束时、异步加载出现异常结果时的事件回调函数以及显示日志函数。具体代码如下:
8) 初始化 zTree 插件。代码如下:
9) 编写 getBigData.php 文件,用来返回存放子节点的 JSON 对象。具体代码如下:
zTree 插件专门适用于项目开发,尤其是开发树菜单、树数据的Web显示及权限管理等。
zTree 插件的主要特点如下:
- 将核心代码按照功能进行了分割,不需要的代码可以不用加载;
- 采用了延迟加载技术,上万节点轻松加载,即使在 IE 6下也能基本做到“秒杀”;
- 兼容 IE、FireFox、Chrome、Opera、Safari 等浏览器;
- 支持JSON数据;
- 支持静态和 AJAX 异步加载节点数据;
- 支持任意更换皮肤、自定义图标;
- 支持极其灵活的复选框或单选按钮选择功能;
- 提供多种事件响应回调。
zTree插件的属性
zTree插件的常用属性及说明如下表所示:属性 | 说明 |
---|---|
setting.treeId | zTree 插件的唯一标识。初始化 zTree 插件后,该属性值等于用户定义的 zTree 容器的 id 属性值 |
async.autoParam | 异步加载时需要自动提交父节点属性的参数 |
async.dataFilter | 用于对 AJAX 返回数据进行预处理的函数 |
async.dataType | AJAX 获取的数据类型 |
async.enable | 设置 zTree 插件是否开启异步加载模式 |
async.type | AJAX 的 HTTP 请求模式 |
async.url | AJAX 获取数据的 URL |
check.enable | 设置 zTree 插件的节点上是否显示复选框/单选按钮 |
data.key.title | zTree 插件的节点数据保存节点提示信息的属性名称 |
data.key.url | zTree 插件的节点数据保存节点链接的目标 URL 的属性名称 |
data.simpleData.enable | 确定 zTree 插件初始化时的节点数据、异步加载时的节点数据或 addNodes 方法中输入的 newNodes 数据是否采用简单数据模式(Array) |
data.simpleData.idKey | 节点数据中保存唯一标识的属性名称 |
data.simpleData.pIdKey | 节点数据中保存其父节点唯一标识的属性名称 |
view.expandSpeed | zTree 插件的节点展开、折叠时的动画速度,设置方法同 jQuery 动画效果中 speed 参数的设置方法 |
view.selectedMulti | 设置是否允许同时选中多个节点 |
view.showIcon | 设置 zTree 插件是否显示节点的图标 |
zTree插件的方法
zTree 插件的常用方法及说明如下表所示。方法 | 说明 |
---|---|
$.fn.zTree.init(obj, zSetting, zNodes) | zTree 插件初始化方法 |
$.fn.zTree.destroy(treeId) | 从 zTree v3.4 开始提供销毁 zTree 插件的方法 |
$.fn.zTree.getZTreeObj(treeId) | zTree v3.x 专门提供的获取 zTree 对象的方法 |
callback.beforeAsync(treeId, treeNode) | 用于捕获异步加载之前的事件回调函数,zTree 插件根据返回值确定是否允许进行异步加载 |
callback.beforeExpand(treeId, treeNode) | 用于捕获父节点展开之前的事件回调函数,zTree 插件根据返回值确定是否允许展开操作 |
callback.beforeDblClick(treeId, treeNode) | 用于捕获 zTree 插件上鼠标双击之前的事件回调函数,zTree 插件根据返回值确定是否触发 onDblClick 事件回调函数 |
callback.onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) | 用于捕获异步加载出现异常错误时的事件回调函数 |
callback.onAsyncSuccess(event, treeId, treeNode, msg) | 用于捕获异步加载正常结束时的事件回调函数 |
callback.onClick(event, treeId, treeNode) | 用于捕获节点被单击时的事件回调函数 |
callback.onDblClick(event, treeId, treeNode) | 用于捕获 zTree 插件上鼠标双击之后的事件回调函数 |
zTreeObj.getNodes() | 获取 zTree 插件的全部节点数据 |
zTreeObj.refresh() | 刷新 zTree 插件 |
treeNode.getNextNode() | 获取与 treeNode 相邻的后一个节点 |
treeNode.getPreNode() | 获取与 treeNode 相邻的前一个节点 |
【实例】本实例使用 zTree 插件异步加载大数据。程序开发步骤如下:
1) 将 zTree 插件中的 css 文件夹复制到实例文件夹 demo 中。创建一个名为 js 的文件夹,将 jquery-3.6.4.min.js 文件以及 jquery.ztree.core-3.5.js 文件复制到 js 文件夹中。
2) 创建一个名为 index.html 的文件,在该文件的 <head> 标记中引入 jQuery 文件、zTree 插件的核心脚本文件以及 zTree 插件的 CSS 样式文件。代码如下:
<link rel="stylesheet" href="css/demo.css" type="text/css"> <link rel="stylesheet" href="css/zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="js/jquery-3.6.4.min.js"></script> <script type="text/javascript" src="js/jquery.ztree.core-3.5.js"></script>
3) 在页面的 <body> 标记中创建两个 <ul> 元素,一个用来显示树菜单,另一个用来显示操作日志。代码如下:
<div class="content_wrap"> <div class="zTreeDemoBackground left"> <ul id="treeDemo" class="ztree"></ul> </div> <ul id="log"></ul> </div>
4) 编写 jQuery 代码,开启异步加载模式,显示节点上的复选框,使用简单数据模式并设置父节点展开之前、异步加载正常结束时、异步加载出现异常错误时的事件回调函数。具体代码如下:
var setting = { async: { enable: true, // 开启异步加载模式 url: getUrl // 获取数据的 URL }, check: { enable: true // 设置在 zTree 插件的节点上显示复选框 }, data: { simpleData: { enable: true // 使用简单数据模式 } }, view: { expandSpeed: "" // 设置 zTree 插件的节点展开、折叠时的动画速度,"" 表示不显示动画效果 }, callback: { beforeExpand: beforeExpand, // 设置父节点展开之前的事件回调函数 onAsyncSuccess: onAsyncSuccess, // 设置异步加载正常结束时的事件回调函数 onAsyncError: onAsyncError // 设置异步加载出现异常错误时的事件回调函数 } };
5) 设置父节点对象。代码如下:
var zNodes = [ { name: "10 个节点", id: "1", count: 10, times: 1, isParent: true }, { name: "100 个节点", id: "2", count: 100, times: 1, isParent: true }, { name: "1000 个节点", id: "3", count: 1000, times: 1, isParent: true } ]; var log, className = "dark", startTime = 0, endTime = 0, perCount = 100, perTime = 100;
6) 编写函数 getUrl() 用来获取接收页面请求的 URL。代码如下:
function getUrl(treeId, treeNode) { var curCount = (treeNode.children) ? treeNode.children.length : 0; var getCount = (curCount + perCount) > treeNode.count ? (treeNode.count - curCount) : perCount; var param = "id=" + treeNode.id + "_" + (treeNode.times++) + "&count=" + getCount; return "getBigData.php?" + param; }
7) 编写父节点展开之前、异步加载正常结束时、异步加载出现异常结果时的事件回调函数以及显示日志函数。具体代码如下:
// 在父节点展开之前执行 function beforeExpand(treeId, treeNode) { if (!treeNode.isAjaxing) { startTime = new Date(); treeNode.times = 1; ajaxGetNodes(treeNode, "refresh"); return true; } else { alert("zTree 正在下载数据中,请稍后展开节点…"); return false; } } // 在异步加载正常结束时执行 function onAsyncSuccess(event, treeId, treeNode, msg) { if (!msg || msg.length == 0) return; var zTree = $.fn.zTree.getZTreeObj("treeDemo"), // 获取 zTree 对象 totalCount = treeNode.count; // 节点数 if (treeNode.children.length < totalCount) { // 子节点数未达到最大值时 setTimeout(function () { ajaxGetNodes(treeNode); }, perTime); // 继续执行 ajaxGetNodes } else { // 子节点数达到最大值时 treeNode.icon = ""; zTree.updateNode(treeNode); // 更新节点数据 zTree.selectNode(treeNode.children[0]); // 选中第 1 个节点 endTime = new Date(); // 结束时间 var usedTime = (endTime.getTime() - startTime.getTime()) / 1000; // 加载完毕消耗的时间 className = (className === "dark" ? "" : "dark"); showLog("[ " + getTime() + " ] treeNode:" + treeNode.name); showLog("加载完毕,共进行 " + (treeNode.times - 1) + " 次异步加载,耗时: " + usedTime + " s"); } } // 在异步加载出现异常结果时执行 function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { var zTree = $.fn.zTree.getZTreeObj("treeDemo"); // 根据 id 属性值获取 zTree 对象 alert("异步获取数据出现异常。"); // 弹出消息提示 treeNode.icon = ""; // 清空图标 zTree.updateNode(treeNode); // 更新节点数据 } function ajaxGetNodes(treeNode, reloadType) { var zTree = $.fn.zTree.getZTreeObj("treeDemo"); // 根据 id 属性值获取 zTree 对象 if (reloadType == "refresh") { // 如果加载类型为刷新 treeNode.icon = "css/zTreeStyle/img/loading.gif"; // 加载时对应的图片 zTree.updateNode(treeNode); // 更新节点数据 zTree.reAsyncChildNodes(treeNode, reloadType, true); // 强行异步加载父节点的子节点 } } // 显示日志 function showLog(str) { if (!log) log = $("#log"); // 获取 log 对象 log.append("<li class='" + className + "'>" + str + "</li>"); // 添加 log 内容 if (log.children("li").length > 4) { // 如果子节点大于 4 log.get(0).removeChild(log.children("li")[0]); // 移除第 1 个节点 } } // 获取当前时间的时、分、秒、毫秒 function getTime() { var now = new Date(), // 当前时间 h = now.getHours(), // 当前时间的小时数 m = now.getMinutes(), // 当前时间的分钟数 s = now.getSeconds(), // 当前时间的秒数 ms = now.getMilliseconds(); // 当前时间的毫秒数 return (h + ":" + m + ":" + s + " " + ms); // 返回时、分、秒、毫秒值 }
8) 初始化 zTree 插件。代码如下:
$(document).ready(function () { $.fn.zTree.init($("#treeDemo"), setting, zNodes); });
9) 编写 getBigData.php 文件,用来返回存放子节点的 JSON 对象。具体代码如下:
[<?php $pId = "-1"; if (array_key_exists('id', $_REQUEST)) { // 如果提交的数据中存在参数 id $pId = $_REQUEST['id']; } $pCount = "10"; if (array_key_exists('count', $_REQUEST)) { // 如果提交的数据中存在参数 count $pCount = $_REQUEST['count']; } if ($pId == null || $pId == "") $pId = "0"; if ($pCount == null || $pCount == "") $pCount = "10"; // 如果参数 count 不存在,则默认 pCount 的值为 10 $max = (int)$pCount; // 设置最大值为 pCount for ($i = 1; $i <= $max; $i++) { // 进行 max 次循环 $nId = $pId . "_" . $i; // 设置节点的 id 值 $nName = "tree" . $nId; echo "{ id:'" . $nId . "', name:'" . $nName . "' }"; // 一个节点的 JSON 数据 if ($i < $max) { // 如果 i 的值小于 max 的值,则输出逗号,目的是组合成多组 JSON 数据 echo ","; } } ?>]运行本实例可以看到,页面左侧显示树状菜单,页面右侧显示日志操作,效果如下图所示:
