// 通用树组件:绑定一个树选择器
function bindTreeSelector(options) {
const {
inputTextId, // 点击显示树的文本框 ID
inputValueId, // 隐藏 value(ID)字段 ID
panelId, // 树的弹出容器 ID
treeId, // zTree 的
元素 ID
ajaxUrl, // 获取树结构的接口
extraSet = null // 点击节点时执行的额外逻辑(可选)
} = options;
let panelVisible = false;
// 1. 初始化树
function loadTree() {
$.ajax({
type: "post",
url: ajaxUrl,
dataType: "json",
headers: {
Authorization: "Bearer " + localStorage.getItem("public_token"),
},
success: function (res) {
$.fn.zTree.init($("#" + treeId), {
view: { dblClickExpand: false, selectedMulti: false, nameIsHTML: true },
data: { simpleData: { enable: true } },
callback: {
onClick: onNodeClick
}
}, res.data || res.obj);
},
error: function () {
console.error("树加载失败:" + ajaxUrl);
}
});
}
loadTree();
// 2. 显示/隐藏
function togglePanel() {
if (panelVisible) {
hidePanel();
} else {
const $input = $("#" + inputTextId);
const pos = $input.position();
$("#" + panelId)
.css({
left: pos.left + "px",
top: pos.top + $input.outerHeight() + "px",
width: $input.outerWidth() + "px"
})
.slideDown("fast");
panelVisible = true;
}
}
function hidePanel() {
$("#" + panelId).fadeOut("fast");
panelVisible = false;
}
// 3. 点击树节点事件
function onNodeClick(event, tid, node) {
if (!node) return;
const zTree = $.fn.zTree.getZTreeObj(treeId);
const pathNodes = node.getPath();
let pathText = pathNodes.map(n => n.name).join("/");
let idValue = node.id;
$("#" + inputTextId).val(pathText);
$("#" + inputValueId).val(idValue);
if (extraSet && typeof extraSet === "function") {
extraSet(node);
}
hidePanel();
}
// 4. 点击输入框显示树
$("#" + inputTextId).on("click", function () {
togglePanel();
return false;
});
// 点击空白关闭(如需要)
$(document).on("click", function (e) {
if (!$(e.target).closest("#" + panelId).length &&
!$(e.target).is("#" + inputTextId)) {
hidePanel();
}
});
}