基于MVC架构的JavaScript动态目录树实现
本文介绍如何利用JavaScript结合MVC架构动态构建目录树。通过分离数据层(Module)、控制层(Control)和视图层(View),利用documentFragment优化DOM操作性能,并实现节点的折叠交互。文章提供了完整的代码示例与结构解析,帮助开发者掌握动态生成复杂层级结构的技巧。
在采用frameset布局的网页开发中,目录树组件十分常见。虽然可以预先编写静态的树形结构,但实际应用中往往需要支持实时修改。因此,实现动态构建目录树成为更优的技术方案。
对MVC设计模式有一定了解后,本文尝试将目录树的构建过程按照M(模型)、V(视图)、C(控制器)三个层次进行拆解与分析。
![Module [数据层]](/uploads/20261024/c0aea4182f34e6c5ba3bd43f4b02b2e1d67e5ce8fb92e1efb8ce99be078290e4.jpg)
接下来将具体展示目录树的构建流程。
Module [数据层]
var tree = {
"id": 0,
"a1": {
"id": 1,
"name": "a1",
"children": {
"b1": "b1_1",
"b2": "b1_2",
"b3": "b1_3"
}
},
"a2": {
"id": 1,
"name": "a2",
"children": {}
},
"a3": {
"id": 1,
"name": "a3",
"children": {
"b1": "b3_1",
"b2": "b3_2",
"b3": "b3_3"
}
}
};该示例展示了一个两层结构的目录树。数据结构中,id用于标识层级关系,name则代表该层级的名称,对应节点显示的文本内容。
Control [控制层]
var Tree = function ( module ){
function createNodeList( obj ) {
//创建ul节点和documentFragmeng中间变量
var n = document.createElement("ul"),
docfrag = document.createDocumentFragment();
//判断obj是根节点还是孩子节点
if(obj.id == 0) {
n.setAttribute("class", "tree_0");
for(var key in obj) {
if(key == "id") continue;
//将节点插入
var c = document.createElement("li"),
span = document.createElement("span");
span.appendChild(document.createTextNode( obj[key].name ));
c.appendChild(span);
docfrag.appendChild( c );
}
}else if(obj.id && obj.id == 1) {
n.setAttribute("class", "tree_1");
for(var key in obj) {
if(key == "id" || key == "name" || !obj.children) continue;
for( var item in obj.children){
//将节点插入
var c = document.createElement("li");
c.appendChild(document.createTextNode( obj.children[item] ));
docfrag.appendChild( c );
}
}
}
n.appendChild( docfrag );
//返回开始构建的ul节点
return n;
}
//隐藏及显示 工具函数
function toggle(c){
c.style.display = ((c.style.display == "none") ? "" : "none");
}
function createTree( obj ) {
var root, child, count = 0;
root = createNodeList( obj );
for(var key in obj){
if(obj[key] == "id" || !obj[key].children) continue;
child = createNodeList(obj[key]);
root.children[count].appendChild( child );
//count来判断插入的位置
count++;
}
return root;
}
var T = createTree(module);
var list = T.children;
for(var i = 0, len = list.length; i < len; i++){
list[i].getElementsByTagName("span")[0].onclick = function(){
var obj = this.nextSibling;
toggle(obj);
}
}
return T;
}在此层级中定义了三个核心函数,其中
createNodeList() //适用于构建一个树子节点代码中利用documentFragment作为节点缓存容器。先将生成的节点添加到documentFragment中,最后统一插入到ul元素内,这是提升DOM操作效率的常用手段。
createTree() //构建一棵树整棵树的构建逻辑主要分为两步:前者负责创建单个子节点,后者负责组装整棵树。
在生成的树结构中绑定了click事件,实现节点的折叠与展开功能。当然,也可以在Tree类中扩展更多交互方法,具体实现可根据需求灵活调整。
View [视图层]
window.onload = function(){
var T = new Tree(tree);
document.getElementsByTagName("body")[0].appendChild(T);
}目录树的构建核心在于DOM元素的处理,开发者必须熟练掌握相关API的使用。
至此,关于使用JS动态构建目录树的介绍完毕。希望本文内容能对读者有所帮助,欢迎继续支持本站。
sigma.js 怎么实现节点点击、拖拽与悬停提示交互
2026-11-05 15:03:27
Matter.js 与 PixiJS/Three.js 集成:分离物理计算与渲染
2026-11-05 13:43:48
主流JS弹幕库选型指南:Danmaku.js等库的功能与体积对比
2026-11-05 09:28:19
JavaScript点击事件监听与交互效果实例
2026-11-05 09:10:19
自定义JS颜色选择器UI样式与交互细节
2026-11-05 09:09:06
