JS动态构建一棵目录树
2015-07-12 01:19
609 查看
JS动态构建一棵目录树
在使用frameset布局的时候,经常会用到目录树,我们可以把一棵树写死,但是更多的情况是,这棵树需要随时被改动,所以我们期望的是他能够被动态的构建。MVC,算是了解一点,那本文就把这棵树根据M-V-C给拆开分解吧。
点击链接demo→
下面就来看看这棵树是怎么构建的。
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来表示改层的名字(也就是节点Text内容吧)。
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,这也是比较常用的使用方式。
createTree() //构建一棵树
基本整棵树的构建就是分为这两步,前者负责创建一个子节点,后者构建一棵树。
在这颗树中绑定了click事件,让其可以折叠,当然也可以在Tree这个类里绑定更多的方法,这个就靠自己发挥了。
View [视图层]
window.onload = function(){ var T = new Tree(tree); document.getElementsByTagName("body")[0].appendChild(T); }
整棵树的构建,主要用到的是DOM元素的处理,这个必须牢牢掌握!
相关文章推荐
- JavaScript中需要注意的几个问题
- JavaScript模板引擎原理,几行代码的事儿
- [解惑]JavaScript事件机制
- 你所不知道的JavaScript数组
- 如何让你的JavaScript代码更加语义化
- js默认编码方式
- Javascript数据类型转换规则
- JS DOM编程艺术——图片库优化—— JS学习笔记2015-7-11(第82天)
- Introduction to Json
- js面向对象
- Javascript与Ajax
- javascript事件学习笔记
- HTML传递参数给JS
- 【 D3.js 入门系列 — 2.1 】 选择、插入、删除元素
- javascript方法大收集
- [JS] JavaScript由浅入深(2) 进阶
- 利用javascript获取url中的传值并创建页面元素
- JavaScript中的隐式类型转换
- JSP标准标签库
- JavaScript中对象转换为原始值的问题