博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS动态构建一棵目录树
阅读量:4929 次
发布时间:2019-06-11

本文共 3278 字,大约阅读时间需要 10 分钟。

                                                 

在使用frameset布局的时候,经常会用到目录树,我们可以把一棵树写死,但是更多的情况是,这棵树需要随时被改动,所以我们期望的是他能够被动态的构建。

MVC,算是了解一点,那本文就把这棵树根据M-V-C给拆开分解吧。

下面就来看看这棵树是怎么构建的。 

 

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元素的处理,这个必须牢牢掌握!

转载于:https://www.cnblogs.com/lizonghai/p/4639755.html

你可能感兴趣的文章
delphi 接口Interface
查看>>
弹性盒模型display:flex
查看>>
应用层常用协议
查看>>
iOS 7 UI 过渡指南 - 開始之前(iOS 7 UI Transition Guide - Before You Start)
查看>>
POJ2155:Matrix(二维树状数组,经典)
查看>>
JDK5什么是新的堵塞队列线程(四)
查看>>
怎样基于android4.4.2的源代码和android-4.3.1_r1的驱动编译I9250的ROM
查看>>
TCP和UDP协议的应用/参数查看
查看>>
要看的
查看>>
[翻译]ASP.NET MVC 3 开发的20个秘诀(四)[20 Recipes for Programming MVC 3]:实现多语言支持...
查看>>
centos6.5下,使用虚拟ftp用户
查看>>
解决windows10 安装不了.net 3.5问题
查看>>
IMX6开发板-Android4.4-串口屏蔽gps文档及测试例程
查看>>
设计模式系列--Proxy
查看>>
VS2010生成Qt程序图标修改方法
查看>>
c++中调用cygwin/x使用ncl
查看>>
gcc -l参数和-L参数
查看>>
考分鄙视(exam)
查看>>
ural1090 In the Army Now
查看>>
动态逆序对
查看>>