JQuery Ztree 樹插件配置與應用小結 by:授客 QQ:1033553122 測試環境 Win7 jquery-3.2.1.min.js 下載地址: https://gitee.com/ishouke/front_end_plugin/blob/master/jquery-3.2.1.mi ...
JQuery Ztree 樹插件配置與應用小結
by:授客 QQ:1033553122
測試環境
Win7
jquery-3.2.1.min.js
下載地址:
https://gitee.com/ishouke/front_end_plugin/blob/master/jquery-3.2.1.min.js
zTree_v3-master.zip
下載地址:
https://github.com/zTree/zTree_v3
插件配置與應用
應用效果展示
HTML代碼片段
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其後! -->
{% load staticfiles %}
……略
<!-- zTree -->
<link rel="stylesheet" href="{% static 'website/zTree-3.5/css/demo.css' %}" type="text/css" />
<link rel="stylesheet" href="{% static 'website/zTree-3.5/css/metroStyle/metroStyle.css' %}" type="text/css" />
<script type="text/javascript" src="{% static 'website/zTree-3.5/js/jquery.ztree.core.js' %}" defer></script>
<script type="text/javascript" src="{% static 'website/zTree-3.5/js/jquery.ztree.excheck.js' %}" defer></script>
<script type="text/javascript" src="{% static 'website/zTree-3.5/js/jquery.ztree.exedit.js' %}" defer></script>
……略
<script type="text/javascript" src="{% static 'website/js/resource-setting.js' %}" defer></script>
……略
</head>
<body>
<div class="container-fluid">
<div class="row">
<div>
<button class="btn btn-primary" data-toggle="modal" data-target="#resourceDialog">點擊創建一級根目錄</button>
</div>
<div class="zTreeDemoBackground left">
{# <ul id="treeDemo" class="ztree" style="height:800px"></ul>#}
<ul id="ztree" class="ztree"></ul>
</div>
</div>
</div>
……略
</body>
</html>
JS代碼片段
resource-setting.js
/**
* ztree 設置
*
*/
var setting = {
view: {
addHoverDom: addHoverDom,
removeHoverDom: removeHoverDom,
selectedMulti: false
},
check: {
enable: false
},
data: {
simpleData: { // true / false 分別表示使用 / 不使用簡單數據模式如果設置為 true,請務必設置 setting.data.simpleData 內的其他參數: idKey / pIdKey / rootPId,並且讓數據滿足父子關係。
enable: true,
idKey: "id", // 節點數據中保存唯一標識的屬性名稱。[setting.data.simpleData.enable = true 時生效]
pIdKey: "pId", // 節點數據中保存其父節點唯一標識的屬性名稱。[setting.data.simpleData.enable = true 時生效]
rootPId: 0 // 用於修正根節點父節點數據,即 pIdKey 指定的屬性值。[setting.data.simpleData.enable = true 時生效]
}
},
edit: {
enable: true
},
callback: {
beforeRemove: zTreeBeforeRemove,
beforeEditName: zTreeBeforeEditName,
beforeDrag:function(){return false;} // 禁止拖拽
}
};
/**
* 用於當滑鼠移動到節點上時,顯示用戶自定義控制項,同時給控制項(例中為“新增”按鈕)綁定點擊事件:打開新增資源樹節點信息模態對話框
*/
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='add node' onfocus='this.blur();'></span>";
sObj.after(addStr);
var btn = $("#addBtn_"+treeNode.tId); //“新增”圖標按鈕
if (btn) btn.bind("click", function(){ // 給“新增”圖標按鈕綁定點擊事件
currentZtreeNode = treeNode; // 保存點擊的節點,作為新增資源節點的父節點,在提交表單時使用
opType = 'add'; // 設置操作類型為新增
$('#'+ resourceDialogID).modal('show'); // 打開對話框
return false;
});
};
/**
* 於當滑鼠移出節點時,隱藏用戶自定義控制項
* @param treeId
* @param treeNode
*/
function removeHoverDom(treeId, treeNode) {
$("#addBtn_" + treeNode.tId).unbind().remove();
};
/**
* 用於捕獲節點被刪除之前的事件回調函數,並且根據返回值確定是否允許刪除操作
* @param treeId
* @param treeNode
* @returns {boolean}
*/
function zTreeBeforeRemove(treeId, treeNode) {
var index = treeNode.name.indexOf(' [')
var nodeName = ''
if (index != -1) {
nodeName = treeNode.name.substr(0, index);
} else {
nodeName = treeNode.name;
}
var mark = true; // 標記是否刪除成功
if (confirm('是否刪除資源"' + nodeName + '"?')) {
var nodeID = treeNode.id;
$.ajax({
type: "POST",
url: deleteResourceZtreeNodeURL,
async: false,
data: {'nodeID': nodeID},
success: function (result) {
if (result.success == 'true') {
alert(result.msg);
mark = true;
} else {
alert(result.msg + "," + result.reason);
mark = false;
}
},
error: function(XmlHttpRequest, textStatus, errorThrown) {
alert('刪除資源樹節點請求失敗' + XmlHttpRequest.responseText);
mark = false;
}
});
return mark;
} else {
return false;
}
}
/**
* 用於捕獲節點編輯按鈕的 click 事件,並且根據返回值確定是否允許進入名稱編輯狀態,同時打開資源樹修改節點信息模態對話框
* @param treeId
* @param treeNode
* @returns {boolean}
*/
function zTreeBeforeEditName(treeId, treeNode) {
currentZtreeNode = treeNode; // 記錄操作的節點
opType = 'update'; // 設置操作類型為修改
var nodeID = treeNode.id;
// 獲取節點信息,並填充表單
$.ajax({
type: "get",
url: queryResourceZtreeNodeURL,
async: false,
data: {'nodeID': nodeID },
success: function (result) {
if (result.success == 'true') {
//alert(result.msg);
var resourceFormSelector = '#' + resourceFormID;
// 序列化表單,獲取表單組件 name屬性,表單設計 name屬性值和id屬性值是一樣的,所以也就獲取表單組件id
var dataArray = $(resourceFormSelector).serializeArray();
$.each(dataArray, function () {
$('#' + this.name).val(result.data[this.name]);
});
$('#' + resourceDialogID).modal('show'); // 打開修改模態對話框
} else {
// 重置變數
currentZtreeNode = null;
opType = 'add';
alert(result.msg + "," + result.reason);
}
},
error: function(XmlHttpRequest, textStatus, errorThrown) {
// 重置變數
opType = 'add';
currentZtreeNode = null;
alert('查詢資源樹節點信息請求失敗' + XmlHttpRequest.responseText);
}
});
return false; // 不進入編輯狀態
}
getResourcesTreeNodes().then(function(result) {
if (result.success == 'true') {
$.fn.zTree.init($('#' + resouceZtreeID), setting, result.data);
} else {
alert(result.msg + "," + result.reason);
}
});
代碼分析
setting.view.addHoverDom
用於當滑鼠移動到節點上時,顯示用戶自定義控制項,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
請務必與 setting.view.removeHoverDom 同時使用;屬於高級應用,使用時請確保對 zTree 比較瞭解。
預設值:null
參數說明
treeIdString 對應 zTree 的 treeId,便於用戶操控
treeNodeJSON 需要顯示自定義控制項的節點 JSON 數據對象
setting.view.removeHoverDom
用於當滑鼠移出節點時,隱藏用戶自定義控制項,顯示隱藏狀態同 zTree 內部的編輯、刪除按鈕
請務必與 addHoverDom 同時使用;屬於高級應用,使用時請確保對 zTree 比較瞭解。
預設值:null
參數說明
treeIdString 對應 zTree 的 treeId,便於用戶操控
treeNodeJSON 需要隱藏自定義控制項的節點 JSON 數據對象
setting.check.enable
設置 zTree 的節點上是否顯示 checkbox / radio
預設值: false
參數值:true / false 分別表示 顯示 / 不顯示 覆選框或單選框
setting 舉例:需要顯示 checkbox
var setting = {
check: {
enable: true
}
};
......
setting.check.chkStyle
勾選框類型(checkbox 或 radio)[setting.check.enable = true 時生效]
預設值:"checkbox"
參數值: 值為 "checkbox" 時,顯示 checkbox 選擇框,setting.check.chkboxType 屬性有效。 值為 "radio" 時,顯示 radio 選擇框, setting.check.radioType 屬性有效。
請註意大小寫,不要改變
setting 舉例: 設置選擇框為 radio
var setting = {
check: {
enable: true,
chkStyle: "radio"
}
};
......
setting.view.selectedMulti
設置是否允許同時選中多個節點。
預設值: true
參數值:true / false 分別表示 支持 / 不支持 同時選中多個節點
1、設置為 true時,按下 Ctrl 或 Cmd 鍵可以選中多個節點
2、設置為 true / false 都不影響按下 Ctrl 或 Cmd 鍵可以讓已選中的節點取消選中狀態( 取消選中狀態可以參考 setting.view.autoCancelSelected )
setting 舉例: 禁止多點同時選中的功能
var setting = {
view: {
selectedMulti: false
}
};
......
setting.data.simpleData.enable
確定 zTree 初始化時的節點數據、非同步載入時的節點數據、或 addNodes 方法中輸入的 newNodes 數據是否採用簡單數據模式 (Array)
不需要用戶再把資料庫中取出的 List 強行轉換為複雜的 JSON 嵌套格式
預設值:false
參數:true / false 分別表示 使用 / 不使用 簡單數據模式
如果設置為 true,請務必設置 setting.data.simpleData 內的其他參數: idKey / pIdKey / rootPId,並且讓數據滿足父子關係。
setting.data.simpleData.idKey
節點數據中保存唯一標識的屬性名稱。[setting.data.simpleData.enable = true 時生效]
預設值:"id"
setting.data.simpleData.pIdKey
節點數據中保存其父節點唯一標識的屬性名稱。[setting.data.simpleData.enable = true 時生效]
預設值:"pId"
rootPId
用於修正根節點父節點數據,即 pIdKey 指定的屬性值。[setting.data.simpleData.enable = true 時生效]
預設值:null
setting 舉例: 使用簡單 Array 格式的數據
var setting = {
data: {
simpleData: {
enable: true,
idKey: "id",
pIdKey: "pId",
rootPId: 0
}
}
};
var treeNodes = [
{"id":1, "pId":0, "name":"test1"},
{"id":11, "pId":1, "name":"test11"},
{"id":12, "pId":1, "name":"test12"},
{"id":111, "pId":11, "name":"test111"}
];
......
setting.edit.enable
設置 zTree 是否處於編輯狀態
請在初始化之前設置,初始化後需要改變編輯狀態請使用 zTreeObj.setEditable() 方法
預設值: false
參數說明:true / false 分別表示 可以 / 不可以 編輯
編輯狀態規則說明
1、點擊節點時,不會打開 node.url 指定的 URL。
2、全面支持 編輯 與 非同步載入 狀態共存。
3、可以對節點進行拖拽,且支持多棵樹之間進行拖拽。
4、支持拖拽時 複製/移動 節點。(參考: setting.edit.drag.isCopy / setting.edit.drag.isMove)
5、可以通過編輯按鈕修改 name 屬性。
6、可以通過刪除按鈕刪除節點。
請註意大小寫,不要改變
setting 舉例:設置 zTree 進入編輯狀態
var setting = {
edit: {
enable: true
}
};
......
setting.callback.beforeRemove
用於捕獲節點被刪除之前的事件回調函數,並且根據返回值確定是否允許刪除操作
預設值:null
參數說明
treeIdString 對應 zTree 的 treeId,便於用戶操控
treeNodeJSON 將要刪除的節點 JSON 數據對象
返回值 true / false
如果返回 false,zTree 將不刪除節點,也無法觸發 onRemove 事件回調函數
setting && function舉例: 禁止全部刪除操作
function zTreeBeforeRemove(treeId, treeNode) {
return false;
}
var setting = {
edit: {
enable: true
},
callback: {
beforeRemove: zTreeBeforeRemove
}
};
......
setting.callback.beforeEditName
用於捕獲節點編輯按鈕的 click 事件,並且根據返回值確定是否允許進入名稱編輯狀態
此事件回調函數最主要是用於捕獲編輯按鈕的點擊事件,然後觸發自定義的編輯界面操作。
預設值:null
參數說明
treeIdString 對應 zTree 的 treeId,便於用戶操控
treeNodeJSON 將要進入編輯名稱狀態的節點 JSON 數據對象
返回值 true / false
如果返回 false,節點將無法進入 zTree 預設的編輯名稱狀態
setting & function 舉例: 禁止修改父節點的名稱
function zTreeBeforeEditName(treeId, treeNode) {
return !treeNode.isParent;
}
var setting = {
edit: {
enable: true
},
callback: {
beforeEditName: zTreeBeforeEditName
}
};
......
setting.callback.beforeDrag
用於捕獲節點被拖拽之前的事件回調函數,並且根據返回值確定是否允許開啟拖拽操作
預設值:null
參數說明
treeIdString 被拖拽的節點 treeNodes 所在 zTree 的 treeId,便於用戶操控
treeNodesArray(JSON) 要被拖拽的節點 JSON 數據集合
v3.x 允許多個同級節點同時被拖拽,因此將此參數修改為 Array(JSON)
如果拖拽時多個被選擇的節點不是同級關係,則只能拖拽滑鼠當前所在位置的節點
返回值 true / false
如果返回 false,zTree 將終止拖拽,也無法觸發 onDrag / beforeDrop / onDrop 事件回調函數
setting & function 舉例: 禁止全部拖拽操作
function zTreeBeforeDrag(treeId, treeNodes) {
return false;
};
var setting = {
edit: {
enable: true
},
callback: {
beforeDrag: zTreeBeforeDrag
}