【ztree】zTree節點增刪改
今天遇到一個需求是對zTree的節點進行增刪改,經過查閱資料總結如下: 效果: 完成增刪改,要注意幾個關鍵點: 使用 編輯功能,必須設定 setting.edit 中的各個屬性使用 編輯功能的事件回撥函式,必須設定 setting.callback.beforeRemove / onRemove / beforeRename / onRename 等屬性zTree 不提供預設的增加按鈕,如要實現需要利用自定義控制元件的方法 addHoverDom / removeHoverDom 我們利用 beforeEditName 來觸發自定義的編輯操作 首先,我們來看看具體的配置資訊(詳細內容見程式碼中的註釋):
<head>
<meta charset="UTF-8">
<title>zTree測試</title>
<link rel="stylesheet" type="text/css" href="css/demo.css" />
<link rel="stylesheet" type="text/css" href="css/zTreeStyle/zTreeStyle.css" />
<script src="js/jquery-1.4.4.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.ztree.all.js" type="text/javascript" charset="utf-8"></script>
</head>
<script type="text/javascript">
var zTree;
var setting = {
view:{
addHoverDom:addHoverDom,
removeHoverDom:removeHoverDom,
selectedMulti:false
},
edit: {
enable: true,
editNameSelectAll:true,
removeTitle:'刪除',
renameTitle:'重新命名'
},
data: {
/ keep:{
parent:true,
leaf:true
}, /
simpleData: {
enable: true
}
},
callback:{
beforeRemove:beforeRemove,//點選刪除時觸發,用來提示使用者是否確定刪除(可以根據返回值 true|false 確定是否可以刪除)
beforeEditName: beforeEditName,//點選編輯時觸發,用來判斷該節點是否能編輯
beforeRename:beforeRename,//編輯結束時觸發,用來驗證輸入的資料是否符合要求(也是根據返回值 true|false 確定是否可以編輯完成)
onRemove:onRemove,//(beforeRemove返回true之後可以進行onRemove)刪除節點後觸發,使用者後臺操作
onRename:onRename,//編輯後觸發,用於操作後臺
beforeDrag:beforeDrag,//使用者禁止拖動節點
onClick:clickNode//點選節點觸發的事件
}
};
var zNodes =[
{ id:1, pId:0, name:"父節點 1", open:true},
{ id:11, pId:1, name:"去百度",url:'http://www.baidu.com</span><span style="background-color: #f5f5f5; color: #000000;">',target:'_blank'},
{ id:12, pId:1, name:"葉子節點 1-2"},
{ id:13, pId:1, name:"葉子節點 1-3"},
{ id:2, pId:0, name:"父節點 2", open:true},
{ id:21, pId:2, name:"葉子節點 2-1"},
{ id:22, pId:2, name:"葉子節點 2-2"},
{ id:23, pId:2, name:"葉子節點 2-3"},
{ id:3, pId:0, name:"父節點 3", open:true},
{ id:31, pId:3, name:"葉子節點 3-1"},
{ id:32, pId:3, name:"葉子節點 3-2"},
{ id:33, pId:3, name:"葉子節點 3-3"}
];
$(document).ready(function(){
zTree = $.fn.zTree.init($("#tree"), setting, zNodes);
});
function beforeRemove(e,treeId,treeNode){
return confirm("你確定要刪除嗎?");
}
function onRemove(e,treeId,treeNode){
if(treeNode.isParent){
var childNodes = zTree.removeChildNodes(treeNode);
var paramsArray = new Array();
for(var i = 0; i < childNodes.length; i++){
paramsArray.push(childNodes[i].id);
}
alert("刪除父節點的id為:"+treeNode.id+"\r\n他的孩子節點有:"+paramsArray.join(","));
return;
}
alert("你點選要刪除的節點的名稱為:"+treeNode.name+"\r\n"+"節點id為:"+treeNode.id);
}
function beforeEditName(treeId,treeNode){
/ if(treeNode.isParent){
alert("不準編輯非葉子節點!");
return false;
} /
return true;
}
function beforeRename(treeId,treeNode,newName,isCancel){
if(newName.length < 3){
alert("名稱不能少於3個字元!");
return false;
}
return true;
}
function onRename(e,treeId,treeNode,isCancel){
alert("修改節點的id為:"+treeNode.id+"\n修改後的名稱為:"+treeNode.name);
}
function clickNode(e,treeId,treeNode){
if(treeNode.id == 11){
location.href=treeNode.url;
}else{
alert("節點名稱:"+treeNode.name+"\n節點id:"+treeNode.id);
}
}
function beforeDrag(treeId,treeNodes){
return false;
}
var newCount = 1;
function addHoverDom(treeId,treeNode){
var sObj = $("#" + treeNode.tId + "_span");
if (treeNode.editNameFlag || $("#addBtn"+treeNode.tId).length>0) return;
var addStr = "<span class='button add' id='addBtn" + treeNode.tId
+ "' title='新增子節點' onfocus='this.blur();'></span>";
sObj.after(addStr);
var btn = $("#addBtn"+treeNode.tId);
if (btn) btn.bind("click", function(){
//在這裡向後臺傳送請求儲存一個新建的葉子節點,父id為treeNode.id,讓後將下面的100+newCount換成返回的id
//zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, name:"新建節點" + (newCount++)});
alert("開始新增節點")
return false;
});
}
function removeHoverDom(treeId,treeNode){
$("#addBtn"+treeNode.tId).unbind().remove();
}
</script>
$(document).ready(function() {
geneTypeTree();
});
/S 刪除/
function beforeRemove(treeId, treeNode) {
if(confirm(“確認刪除?\n將會刪除下面的所有視訊!”)){
if(treeNode.isParent){
alert(“該目錄下面還有子目錄,請從最底層目錄開始刪除!”);
return false;
}
return true;
}
return false;
}
function onRemove(e, treeId,treeNode) {
var typeId = treeNode.typeId;
$.post(contextPath+"/trainacontentType_deleteTrainContentTypeById.action",
{“typeId”:typeId},
function(repsonse){
alert(repsonse.result);
if(“刪除成功”==repsonse.result)//刪除成功之後執行查詢
btnFindFy();
}
,‘json’)
}
/E 刪除*/
function beforeEditName(treeId,treeNode) {
/ if(treeNode.isParent){
alert(“不準編輯非葉子節點!”);
return false;
} /
return true;
}
function beforeRename(treeId,treeNode, newName,isCancel) {
if (newName.length < 3) {
alert(“名稱不能少於3個字元!”);
return false;
}
return true;
}
function onRename(e, treeId,treeNode, isCancel) {
if(confirm(“您確認修改類別名稱?”)){
$.post(contextPath+"/trainacontentType_updateTraincontenttypeName.action",
{
“traincontenttype.typeid”:treeNode.typeId,
“traincontenttype.typename”:treeNode.typeName
},
function(response){
if(response != null){
if(“修改成功”==response.result){
alert(response.result);
}
}
}
,
‘json’);
}
}
/S 點選事件*/
function clickNode(e, treeId,treeNode) {
$("#trainContentTypeId").val(treeNode.typeId);//向隱藏的類別編號賦值
$("[name=‘typeId’]").val(treeNode.typeId);//向隱藏的類別編號賦值
$("#yeHao").val(“1”);
btnFindFy();
}
/E 點選事件**/
function addHoverDom(treeId,treeNode) {
var sObj = $("#"+ treeNode.tId+ “_span”);
if (treeNode.editNameFlag|| $("#addBtn"+ treeNode.tId).length > 0)
return;
var addStr = “”;
sObj.after(addStr);
var btn = $("#addBtn"+ treeNode.tId);
if (btn)btn.bind(“click”,function() {
if(confirm(“確認在該目錄下面新增培訓內容類別?”)){
var typeName = prompt(“請輸入類別名稱”);//獲取到的名字
if(typeName != null){//點選確定
if(typeName.length>1){
var upId = treeNode.typeId;//上級編號
$.post(contextPath+"/trainacontentTypeaddTraincontenttype.action",
{
“traincontenttype.upid”:upId,
“traincontenttype.typename”:typeName
},
function(response){
if(response!=null){
alert(response.result);
}
if(response.result == “新增成功” ){
var traincontenttype = response.traincontenttype;//獲取返回來的資料
zTree.addNodes(treeNode, {typeId:traincontenttype.typeid, upId:treeNode.id, typeName:typeName});
}
// geneTypeTree();
},
‘json’);
}else{
alert(“請輸入正確的類別名稱”)
}
}
}
//在這裡向後臺傳送請求儲存一個新建的葉子節點,父id為treeNode.id,讓後將下面的100+newCount換成返回的id
//zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, name:“新建節點” + (newCount++)});
return false;
});
}
function removeHoverDom(treeId,treeNode) {
$("#addBtn" + treeNode.tId).unbind().remove();
} 下面附一個更加詳細的最近用到的樹: (包含展開所有節點,點選,重新命名,刪除,新增等事件,以及驗證操作)/*S 左邊樹相關操作/
/
查詢課程類別樹結構
/
function getTypeTree(){
KaTeX parse error: Expected '}', got 'EOF' at end of input: …trainSchemeId":("#trainSchemeId").val()},geneTypeTree);
}
/
生成課程類別樹函式
@param typeTree 返回的課程類別資訊(多一條虛擬的課程類別節點)
/
function geneTypeTree(typeTree){
var setting = {
view : {
addHoverDom : addHoverDom,//用於當滑鼠移動到節點上時,顯示使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
removeHoverDom : removeHoverDom,//用於當滑鼠移出節點時,隱藏使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
selectedMulti : false //設定是否允許同時選中多個節點。
},
edit : {
enable : true,//設定 zTree 是否處於編輯狀態
editNameSelectAll : true,//節點編輯名稱 input 初次顯示時,設定 txt 內容是否為全選狀態。
removeTitle : ‘刪除課程類別’,
renameTitle : ‘重新命名課程類別’
},
data : {
simpleData : {
enable : true,
idKey : “typenum”,
pIdKey : “uptypenum”,
rootPId : “1”
},
key : {
name : “typename”,
}
},
callback : {
beforeRemove : beforeRemove,//點選刪除時觸發,用來提示使用者是否確定刪除
beforeEditName : beforeEditName,//點選編輯時觸發,用來判斷該節點是否能編輯
beforeRename : beforeRename,//編輯結束時觸發,用來驗證輸入的資料是否符合要求
onRemove : onRemove,//刪除節點後觸發,使用者後臺操作
onRename : onRename,//編輯後觸發,用於操作後臺
onClick : clickNode//點選節點觸發的事件
}
};
var treeNodes = typeTree;//樹節點資料(從後臺獲取)
("#treeDiv"), setting, treeNodes);//在介面生成一顆樹
openAllTreenode();//展開樹的所有節點
}
/
展開樹的所有節點
/
function openAllTreenode(){
// 獲取樹物件
var treeObj = $.fn.zTree.getZTreeObj("treeDiv");
/ 獲取所有樹節點 /
var nodes = treeObj.transformToArray(treeObj.getNodes());
// 展開除第一級之外的其他節點
for (var i = 0, length1 = nodes.length; i < length_1; i++) {
if(nodes[i].level == 0){
continue;
}
nodes[i].open = true;
}
//展開第一級節點
treeObj.expandNode(nodes[0], true);
}
/S 刪除/
/
刪除前的詢問(驗證是否可以刪除)
@param treeId
@param treeNode 需要刪除的樹節點
@returns {boolean} 是否可以執行刪除函式
/
function beforeRemove(treeId, treeNode) {
var layer =getLauiLayer();
if(treeNode.level == 0){
layer.msg(“您不可以刪除根節點!請從二級節點開始操作!”,{icon:2,shade: [0.8, ‘#393D49’]})
return false;
}
if(treeNode.isParent){
layer.msg(“該目錄下面還有子目錄,請從最底層目錄開始刪除!”,{icon:2,shade: [0.8, ‘#393D49’]})
return false;
}
//如果表格中有資料就不讓刪除
if($("#trainCourseTbody").children(“tr”).length>0){
layer.msg(“該節點已經排有課程,不允許刪除課程類別!先刪除培養方案課程!”,{icon:2,time:21000,shade: [0.8, ‘#393D49’]});
return false;
}
if(confirm(“確認刪除?”)){
return true;
}
return false;
}
/
刪除的操作
@param e 事件
@param treeId 樹的介面中的ID
@param treeNode 節點
/
function onRemove(e, treeId,treeNode) {
var layer = getLauiLayer();
var trainSchemeId = getTrainSchemeId();//培養方案編號
var typeNum = treeNode.typenum;//類別num
$.post(contextPath+"/courseType/deleteCourseType.do",{“trainSchemeId”:trainSchemeId,“typeNum”:typeNum},function (response) {
layer.msg(response,{time:21000,shade: [0.8, ‘#393D49’]},function () {
if(“刪除成功” == response){
getTypeTree();//重新生成樹
//1.清空條件
var form = $("#queryTrainCourseForm");
form.find(“input”).not("#queryTrainCourseTrainshemeId").val("");
form.find(“select”).val("");
//2.重新查詢一次
queryTrainCourseByCondition();
}
})
},‘text’)
}
/E 刪除*/
/S 編輯根節點/
/
驗證是否可以進入編輯模式
@param treeId
@param treeNode
@returns {boolean} true|false代表是否進入編輯模式
/
function beforeEditName(treeId,treeNode) {
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
});
//如果是根節點不允許編輯
if(treeNode.level == 0 ){
layer.msg(“您不能編輯根節點!”,{icon:2,shade: [0.8, ‘#393D49’]});
return false;
}
return true;
}
/
用於捕獲節點編輯名稱結束(Input 失去焦點 或 按下 Enter 鍵)之後,更新節點名稱資料之前的事件回撥函式,並且根據返回值確定是否允許更改名稱的操作
@param treeId
@param treeNode
@param newName
@param isCancel
@returns {boolean} 是否成功
/
function beforeRename(treeId,treeNode, newName,isCancel) {
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
})
if (($.trim(newName)).length < 2) {
layer.alert(“名稱不能少於2個字元!”)
return false;
}
return true;
}
/
修改名稱的操作(正經的修改傳到後臺進行操作)
@param e
@param treeId
@param treeNode
@param isCancel
/
function onRename(e, treeId,treeNode, isCancel) {
//如果選擇了取消,重新查一下樹
if(isCancel == true){
getTypeTree()
return false;
}
if(confirm(“您確認修改類別名稱?”)) {
KaTeX parse error: Expected '}', got 'EOF' at end of input: …trainSchemeId":("#trainSchemeId").val(),
“typeNum”:treeNode.typenum,
“typeName”:treeNode.typename
},
function(response){
if(response != null){
var layer;
layui.use(“layer”,function () {
layer = layui.layer;
});
layer.msg(response,{shade: [0.8, ‘#393D49’],time:21000,icon:1},function () {
if(“修改成功”==response){
getTypeTree();//修改成功之後重新查一下樹
}
})
}
}
,
‘text’);
}else {//如果選擇了取消重新查一下樹
getTypeTree();//取消之後重新查樹
}
}
/**E 編輯根節點/
/S 點選事件/
/
點選事件
@param e 事件
@param treeId 樹節點的ID
@param treeNode 樹節點
/
function clickNode(e, treeId,treeNode) {
$("#trainCourseTypeNum").val(treeNode.typenum);//向隱藏的課程類別編號賦值(最後新增到表單中傳到後臺儲存)
$("#trainCourseTypeName").val(treeNode.typename);//
$("#typeNum_0").val(treeNode.typenum);//向隱藏的課程類別編號賦值
// queryTrainCourseByCondition();//分頁查詢培養方案課程資訊
clearConditionAndQueryTrainCourse();
}
/E 點選事件/
/
增加一個課程類別事件(自定義元件),用於當滑鼠移動到節點上時,顯示使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
@param treeId 樹節點在介面的編號
@param treeNode 樹節點
*/
function addHoverDom(treeId,treeNode) {
//1.初始化layer模組
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
})
//2.
var sObj = $("#"+ treeNode.tId+ “_span”);
if (treeNode.editNameFlag|| $("#addBtn"+ treeNode.tId).length > 0)
return;
var addStr = “”;
sObj.after(addStr);
var btn = KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲addBtn"+ treeNo…("#trainCourseTbody").children(“tr”).length>0){
layer.msg(“該節點已經排有課程,不允許新增課程類別!”,{icon:2,time:21000,shade: [0.8, ‘#393D49’]});
return;
}
if(confirm(“確認在類別 “+name+” 下新增新的類別?”)){
//1.向隱藏的地方賦值
$(".clear-input").val("");//清空殘留的資料
$("#addType_uptypenum").val(typenum);//上級編號
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲add_trainingsch…("#trainSchemeId").val());//培養方案編號
$("#addType_upTypeName").val(name);//上級類別名稱
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲addType_remark"…(window).width()0.80+‘px’, (’#addTypeModal’)
});
//向頁面隱藏index
$("#hidden_addType_index").val(index);
}
});
}
/
用於當滑鼠移出節點時,隱藏使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
@param treeId
@param treeNode
/
function removeHoverDom(treeId,treeNode) {
$("#addBtn_" + treeNode.tId).unbind().remove();
}
/S 左邊樹相關操作*/今天遇到一個需求是對zTree的節點進行增刪改,經過查閱資料總結如下: 效果: 完成增刪改,要注意幾個關鍵點: 使用 編輯功能,必須設定 setting.edit 中的各個屬性使用 編輯功能的事件回撥函式,必須設定 setting.callback.beforeRemove / onRemove / beforeRename / onRename 等屬性zTree 不提供預設的增加按鈕,如要實現需要利用自定義控制元件的方法 addHoverDom / removeHoverDom 我們利用 beforeEditName 來觸發自定義的編輯操作 首先,我們來看看具體的配置資訊(詳細內容見程式碼中的註釋):
<head>
<meta charset="UTF-8">
<title>zTree測試</title>
<link rel="stylesheet" type="text/css" href="css/demo.css" />
<link rel="stylesheet" type="text/css" href="css/zTreeStyle/zTreeStyle.css" />
<script src="js/jquery-1.4.4.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.ztree.all.js" type="text/javascript" charset="utf-8"></script>
</head>
<script type="text/javascript">
var zTree;
var setting = {
view:{
addHoverDom:addHoverDom,
removeHoverDom:removeHoverDom,
selectedMulti:false
},
edit: {
enable: true,
editNameSelectAll:true,
removeTitle:'刪除',
renameTitle:'重新命名'
},
data: {
/ keep:{
parent:true,
leaf:true
}, /
simpleData: {
enable: true
}
},
callback:{
beforeRemove:beforeRemove,//點選刪除時觸發,用來提示使用者是否確定刪除(可以根據返回值 true|false 確定是否可以刪除)
beforeEditName: beforeEditName,//點選編輯時觸發,用來判斷該節點是否能編輯
beforeRename:beforeRename,//編輯結束時觸發,用來驗證輸入的資料是否符合要求(也是根據返回值 true|false 確定是否可以編輯完成)
onRemove:onRemove,//(beforeRemove返回true之後可以進行onRemove)刪除節點後觸發,使用者後臺操作
onRename:onRename,//編輯後觸發,用於操作後臺
beforeDrag:beforeDrag,//使用者禁止拖動節點
onClick:clickNode//點選節點觸發的事件
}
};
var zNodes =[
{ id:1, pId:0, name:"父節點 1", open:true},
{ id:11, pId:1, name:"去百度",url:'http://www.baidu.com</span><span style="background-color: #f5f5f5; color: #000000;">',target:'_blank'},
{ id:12, pId:1, name:"葉子節點 1-2"},
{ id:13, pId:1, name:"葉子節點 1-3"},
{ id:2, pId:0, name:"父節點 2", open:true},
{ id:21, pId:2, name:"葉子節點 2-1"},
{ id:22, pId:2, name:"葉子節點 2-2"},
{ id:23, pId:2, name:"葉子節點 2-3"},
{ id:3, pId:0, name:"父節點 3", open:true},
{ id:31, pId:3, name:"葉子節點 3-1"},
{ id:32, pId:3, name:"葉子節點 3-2"},
{ id:33, pId:3, name:"葉子節點 3-3"}
];
$(document).ready(function(){
zTree = $.fn.zTree.init($("#tree"), setting, zNodes);
});
function beforeRemove(e,treeId,treeNode){
return confirm("你確定要刪除嗎?");
}
function onRemove(e,treeId,treeNode){
if(treeNode.isParent){
var childNodes = zTree.removeChildNodes(treeNode);
var paramsArray = new Array();
for(var i = 0; i < childNodes.length; i++){
paramsArray.push(childNodes[i].id);
}
alert("刪除父節點的id為:"+treeNode.id+"\r\n他的孩子節點有:"+paramsArray.join(","));
return;
}
alert("你點選要刪除的節點的名稱為:"+treeNode.name+"\r\n"+"節點id為:"+treeNode.id);
}
function beforeEditName(treeId,treeNode){
/ if(treeNode.isParent){
alert("不準編輯非葉子節點!");
return false;
} /
return true;
}
function beforeRename(treeId,treeNode,newName,isCancel){
if(newName.length < 3){
alert("名稱不能少於3個字元!");
return false;
}
return true;
}
function onRename(e,treeId,treeNode,isCancel){
alert("修改節點的id為:"+treeNode.id+"\n修改後的名稱為:"+treeNode.name);
}
function clickNode(e,treeId,treeNode){
if(treeNode.id == 11){
location.href=treeNode.url;
}else{
alert("節點名稱:"+treeNode.name+"\n節點id:"+treeNode.id);
}
}
function beforeDrag(treeId,treeNodes){
return false;
}
var newCount = 1;
function addHoverDom(treeId,treeNode){
var sObj = $("#" + treeNode.tId + "_span");
if (treeNode.editNameFlag || $("#addBtn"+treeNode.tId).length>0) return;
var addStr = "<span class='button add' id='addBtn" + treeNode.tId
+ "' title='新增子節點' onfocus='this.blur();'></span>";
sObj.after(addStr);
var btn = $("#addBtn"+treeNode.tId);
if (btn) btn.bind("click", function(){
//在這裡向後臺傳送請求儲存一個新建的葉子節點,父id為treeNode.id,讓後將下面的100+newCount換成返回的id
//zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, name:"新建節點" + (newCount++)});
alert("開始新增節點")
return false;
});
}
function removeHoverDom(treeId,treeNode){
$("#addBtn"+treeNode.tId).unbind().remove();
}
</script>
$(document).ready(function() {
geneTypeTree();
});
/S 刪除/
function beforeRemove(treeId, treeNode) {
if(confirm(“確認刪除?\n將會刪除下面的所有視訊!”)){
if(treeNode.isParent){
alert(“該目錄下面還有子目錄,請從最底層目錄開始刪除!”);
return false;
}
return true;
}
return false;
}
function onRemove(e, treeId,treeNode) {
var typeId = treeNode.typeId;
$.post(contextPath+"/trainacontentType_deleteTrainContentTypeById.action",
{“typeId”:typeId},
function(repsonse){
alert(repsonse.result);
if(“刪除成功”==repsonse.result)//刪除成功之後執行查詢
btnFindFy();
}
,‘json’)
}
/E 刪除*/
function beforeEditName(treeId,treeNode) {
/ if(treeNode.isParent){
alert(“不準編輯非葉子節點!”);
return false;
} /
return true;
}
function beforeRename(treeId,treeNode, newName,isCancel) {
if (newName.length < 3) {
alert(“名稱不能少於3個字元!”);
return false;
}
return true;
}
function onRename(e, treeId,treeNode, isCancel) {
if(confirm(“您確認修改類別名稱?”)){
$.post(contextPath+"/trainacontentType_updateTraincontenttypeName.action",
{
“traincontenttype.typeid”:treeNode.typeId,
“traincontenttype.typename”:treeNode.typeName
},
function(response){
if(response != null){
if(“修改成功”==response.result){
alert(response.result);
}
}
}
,
‘json’);
}
}
/S 點選事件*/
function clickNode(e, treeId,treeNode) {
$("#trainContentTypeId").val(treeNode.typeId);//向隱藏的類別編號賦值
$("[name=‘typeId’]").val(treeNode.typeId);//向隱藏的類別編號賦值
$("#yeHao").val(“1”);
btnFindFy();
}
/E 點選事件**/
function addHoverDom(treeId,treeNode) {
var sObj = $("#"+ treeNode.tId+ “_span”);
if (treeNode.editNameFlag|| $("#addBtn"+ treeNode.tId).length > 0)
return;
var addStr = “”;
sObj.after(addStr);
var btn = $("#addBtn"+ treeNode.tId);
if (btn)btn.bind(“click”,function() {
if(confirm(“確認在該目錄下面新增培訓內容類別?”)){
var typeName = prompt(“請輸入類別名稱”);//獲取到的名字
if(typeName != null){//點選確定
if(typeName.length>1){
var upId = treeNode.typeId;//上級編號
$.post(contextPath+"/trainacontentTypeaddTraincontenttype.action",
{
“traincontenttype.upid”:upId,
“traincontenttype.typename”:typeName
},
function(response){
if(response!=null){
alert(response.result);
}
if(response.result == “新增成功” ){
var traincontenttype = response.traincontenttype;//獲取返回來的資料
zTree.addNodes(treeNode, {typeId:traincontenttype.typeid, upId:treeNode.id, typeName:typeName});
}
// geneTypeTree();
},
‘json’);
}else{
alert(“請輸入正確的類別名稱”)
}
}
}
//在這裡向後臺傳送請求儲存一個新建的葉子節點,父id為treeNode.id,讓後將下面的100+newCount換成返回的id
//zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, name:“新建節點” + (newCount++)});
return false;
});
}
function removeHoverDom(treeId,treeNode) {
$("#addBtn" + treeNode.tId).unbind().remove();
} 下面附一個更加詳細的最近用到的樹: (包含展開所有節點,點選,重新命名,刪除,新增等事件,以及驗證操作)/*S 左邊樹相關操作/
/
查詢課程類別樹結構
/
function getTypeTree(){
KaTeX parse error: Expected '}', got 'EOF' at end of input: …trainSchemeId":("#trainSchemeId").val()},geneTypeTree);
}
/
生成課程類別樹函式
@param typeTree 返回的課程類別資訊(多一條虛擬的課程類別節點)
/
function geneTypeTree(typeTree){
var setting = {
view : {
addHoverDom : addHoverDom,//用於當滑鼠移動到節點上時,顯示使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
removeHoverDom : removeHoverDom,//用於當滑鼠移出節點時,隱藏使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
selectedMulti : false //設定是否允許同時選中多個節點。
},
edit : {
enable : true,//設定 zTree 是否處於編輯狀態
editNameSelectAll : true,//節點編輯名稱 input 初次顯示時,設定 txt 內容是否為全選狀態。
removeTitle : ‘刪除課程類別’,
renameTitle : ‘重新命名課程類別’
},
data : {
simpleData : {
enable : true,
idKey : “typenum”,
pIdKey : “uptypenum”,
rootPId : “1”
},
key : {
name : “typename”,
}
},
callback : {
beforeRemove : beforeRemove,//點選刪除時觸發,用來提示使用者是否確定刪除
beforeEditName : beforeEditName,//點選編輯時觸發,用來判斷該節點是否能編輯
beforeRename : beforeRename,//編輯結束時觸發,用來驗證輸入的資料是否符合要求
onRemove : onRemove,//刪除節點後觸發,使用者後臺操作
onRename : onRename,//編輯後觸發,用於操作後臺
onClick : clickNode//點選節點觸發的事件
}
};
var treeNodes = typeTree;//樹節點資料(從後臺獲取)
("#treeDiv"), setting, treeNodes);//在介面生成一顆樹
openAllTreenode();//展開樹的所有節點
}
/
展開樹的所有節點
/
function openAllTreenode(){
// 獲取樹物件
var treeObj = $.fn.zTree.getZTreeObj("treeDiv");
/ 獲取所有樹節點 /
var nodes = treeObj.transformToArray(treeObj.getNodes());
// 展開除第一級之外的其他節點
for (var i = 0, length1 = nodes.length; i < length_1; i++) {
if(nodes[i].level == 0){
continue;
}
nodes[i].open = true;
}
//展開第一級節點
treeObj.expandNode(nodes[0], true);
}
/S 刪除/
/
刪除前的詢問(驗證是否可以刪除)
@param treeId
@param treeNode 需要刪除的樹節點
@returns {boolean} 是否可以執行刪除函式
/
function beforeRemove(treeId, treeNode) {
var layer =getLauiLayer();
if(treeNode.level == 0){
layer.msg(“您不可以刪除根節點!請從二級節點開始操作!”,{icon:2,shade: [0.8, ‘#393D49’]})
return false;
}
if(treeNode.isParent){
layer.msg(“該目錄下面還有子目錄,請從最底層目錄開始刪除!”,{icon:2,shade: [0.8, ‘#393D49’]})
return false;
}
//如果表格中有資料就不讓刪除
if($("#trainCourseTbody").children(“tr”).length>0){
layer.msg(“該節點已經排有課程,不允許刪除課程類別!先刪除培養方案課程!”,{icon:2,time:21000,shade: [0.8, ‘#393D49’]});
return false;
}
if(confirm(“確認刪除?”)){
return true;
}
return false;
}
/
刪除的操作
@param e 事件
@param treeId 樹的介面中的ID
@param treeNode 節點
/
function onRemove(e, treeId,treeNode) {
var layer = getLauiLayer();
var trainSchemeId = getTrainSchemeId();//培養方案編號
var typeNum = treeNode.typenum;//類別num
$.post(contextPath+"/courseType/deleteCourseType.do",{“trainSchemeId”:trainSchemeId,“typeNum”:typeNum},function (response) {
layer.msg(response,{time:21000,shade: [0.8, ‘#393D49’]},function () {
if(“刪除成功” == response){
getTypeTree();//重新生成樹
//1.清空條件
var form = $("#queryTrainCourseForm");
form.find(“input”).not("#queryTrainCourseTrainshemeId").val("");
form.find(“select”).val("");
//2.重新查詢一次
queryTrainCourseByCondition();
}
})
},‘text’)
}
/E 刪除*/
/S 編輯根節點/
/
驗證是否可以進入編輯模式
@param treeId
@param treeNode
@returns {boolean} true|false代表是否進入編輯模式
/
function beforeEditName(treeId,treeNode) {
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
});
//如果是根節點不允許編輯
if(treeNode.level == 0 ){
layer.msg(“您不能編輯根節點!”,{icon:2,shade: [0.8, ‘#393D49’]});
return false;
}
return true;
}
/
用於捕獲節點編輯名稱結束(Input 失去焦點 或 按下 Enter 鍵)之後,更新節點名稱資料之前的事件回撥函式,並且根據返回值確定是否允許更改名稱的操作
@param treeId
@param treeNode
@param newName
@param isCancel
@returns {boolean} 是否成功
/
function beforeRename(treeId,treeNode, newName,isCancel) {
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
})
if (($.trim(newName)).length < 2) {
layer.alert(“名稱不能少於2個字元!”)
return false;
}
return true;
}
/
修改名稱的操作(正經的修改傳到後臺進行操作)
@param e
@param treeId
@param treeNode
@param isCancel
/
function onRename(e, treeId,treeNode, isCancel) {
//如果選擇了取消,重新查一下樹
if(isCancel == true){
getTypeTree()
return false;
}
if(confirm(“您確認修改類別名稱?”)) {
KaTeX parse error: Expected '}', got 'EOF' at end of input: …trainSchemeId":("#trainSchemeId").val(),
“typeNum”:treeNode.typenum,
“typeName”:treeNode.typename
},
function(response){
if(response != null){
var layer;
layui.use(“layer”,function () {
layer = layui.layer;
});
layer.msg(response,{shade: [0.8, ‘#393D49’],time:21000,icon:1},function () {
if(“修改成功”==response){
getTypeTree();//修改成功之後重新查一下樹
}
})
}
}
,
‘text’);
}else {//如果選擇了取消重新查一下樹
getTypeTree();//取消之後重新查樹
}
}
/**E 編輯根節點/
/S 點選事件/
/
點選事件
@param e 事件
@param treeId 樹節點的ID
@param treeNode 樹節點
/
function clickNode(e, treeId,treeNode) {
$("#trainCourseTypeNum").val(treeNode.typenum);//向隱藏的課程類別編號賦值(最後新增到表單中傳到後臺儲存)
$("#trainCourseTypeName").val(treeNode.typename);//
$("#typeNum_0").val(treeNode.typenum);//向隱藏的課程類別編號賦值
// queryTrainCourseByCondition();//分頁查詢培養方案課程資訊
clearConditionAndQueryTrainCourse();
}
/E 點選事件/
/
增加一個課程類別事件(自定義元件),用於當滑鼠移動到節點上時,顯示使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
@param treeId 樹節點在介面的編號
@param treeNode 樹節點
*/
function addHoverDom(treeId,treeNode) {
//1.初始化layer模組
var layer;
layui.use([‘layer’],function () {
layer = layui.layer;
})
//2.
var sObj = $("#"+ treeNode.tId+ “_span”);
if (treeNode.editNameFlag|| $("#addBtn"+ treeNode.tId).length > 0)
return;
var addStr = “”;
sObj.after(addStr);
var btn = KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲addBtn"+ treeNo…("#trainCourseTbody").children(“tr”).length>0){
layer.msg(“該節點已經排有課程,不允許新增課程類別!”,{icon:2,time:21000,shade: [0.8, ‘#393D49’]});
return;
}
if(confirm(“確認在類別 “+name+” 下新增新的類別?”)){
//1.向隱藏的地方賦值
$(".clear-input").val("");//清空殘留的資料
$("#addType_uptypenum").val(typenum);//上級編號
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲add_trainingsch…("#trainSchemeId").val());//培養方案編號
$("#addType_upTypeName").val(name);//上級類別名稱
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲addType_remark"…(window).width()0.80+‘px’, (’#addTypeModal’)
});
//向頁面隱藏index
$("#hidden_addType_index").val(index);
}
});
}
/
用於當滑鼠移出節點時,隱藏使用者自定義控制元件,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
@param treeId
@param treeNode
/
function removeHoverDom(treeId,treeNode) {
$("#addBtn_" + treeNode.tId).unbind().remove();
}
/S 左邊樹相關操作*/
相關文章
- ztree 篩選選中節點
- layer彈框刪除ztree節點非阻塞問題解決
- jQuery zTree 展示樹形表格jQuery
- onnx 增刪改查,修改節點,刪除節點,修改input,output
- 圍繞DOM元素節點的增刪改查
- ZTree樹和layui框架整合的demo 獲取動態資料實現增刪改查(只展現前臺部分,後臺邏輯自己寫)UI框架
- jQuery的ztree仿windows檔案新建和拖拽效果jQueryWindows
- Tree樹狀圖的動態增刪查改(中)新增節點
- Oracle 10g 增刪節點Oracle 10g
- Spring Boot 入門(六):整合 treetable 和 zTree 實現樹形圖Spring Boot
- 增刪改查
- 文件的增刪改
- SQL增刪改查SQL
- Mongoose查增改刪Go
- indexedDB 增刪改查Index
- mysql增刪改查MySql
- 資料的增刪改
- 列表的增刪改查
- 字典的增刪改查
- mongodb 基本增刪改查MongoDB
- MongoDB增刪改查操作MongoDB
- layui的增刪改查UI
- 單表增刪改查
- mybatis的增刪改查MyBatis
- EFCore之增刪改查
- redist的增刪改查Redis
- sql指令,增,刪,查,改SQL
- mysql基本增刪改查MySql
- iOS CoreData (一) 增刪改查iOS
- Jfinal+layui增刪改查UI
- SQL 基礎增、刪、改、查SQL
- mybatis中的增刪改操作MyBatis
- elasticsearch7.2增刪改查Elasticsearch
- JS基礎_dom增刪改JS
- [express+mongoose](增刪改查)ExpressGo
- CoreData - 簡單 增刪改查
- C# SqlSugar增刪改查C#SqlSugar
- rust sqlx 使用---增刪改查RustSQL