使用JS動(dòng)態(tài)構(gòu)建目錄樹(shù)
在使用frameset布局的時(shí)候,經(jīng)常會(huì)用到目錄樹(shù),我們可以把一棵樹(shù)寫(xiě)死,但是更多的情況是,這棵樹(shù)需要隨時(shí)被改動(dòng),所以我們期望的是他能夠被動(dòng)態(tài)的構(gòu)建。
MVC,算是了解一點(diǎn),那本文就把這棵樹(shù)根據(jù)M-V-C給拆開(kāi)分解吧。
下面就來(lái)看看這棵樹(shù)是怎么構(gòu)建的。
Module [數(shù)據(jù)層]
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" } } };
這是一顆兩層的目錄樹(shù),用ID來(lái)表示層級(jí)關(guān)系,name來(lái)表示改層的名字(也就是節(jié)點(diǎn)Text內(nèi)容吧)。
Control [控制層]
var Tree = function ( module ){ function createNodeList( obj ) { //創(chuàng)建ul節(jié)點(diǎn)和documentFragmeng中間變量 var n = document.createElement("ul"), docfrag = document.createDocumentFragment(); //判斷obj是根節(jié)點(diǎn)還是孩子節(jié)點(diǎn) if(obj.id == 0) { n.setAttribute("class", "tree_0"); for(var key in obj) { if(key == "id") continue; //將節(jié)點(diǎn)插入 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){ //將節(jié)點(diǎn)插入 var c = document.createElement("li"); c.appendChild(document.createTextNode( obj.children[item] )); docfrag.appendChild( c ); } } } n.appendChild( docfrag ); //返回開(kāi)始構(gòu)建的ul節(jié)點(diǎn) return n; } //隱藏及顯示 工具函數(shù) 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來(lái)判斷插入的位置 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; }
這里邊創(chuàng)建了三個(gè)函數(shù),其中
createNodeList() //適用于構(gòu)建一個(gè)樹(shù)子節(jié)點(diǎn)
其中使用documentFragment作為一個(gè)節(jié)點(diǎn)緩存器,先把節(jié)點(diǎn)放置到documentFragment中,然后統(tǒng)一插入到ul,這也是比較常用的使用方式。
createTree() //構(gòu)建一棵樹(shù)
基本整棵樹(shù)的構(gòu)建就是分為這兩步,前者負(fù)責(zé)創(chuàng)建一個(gè)子節(jié)點(diǎn),后者構(gòu)建一棵樹(shù)。
在這顆樹(shù)中綁定了click事件,讓其可以折疊,當(dāng)然也可以在Tree這個(gè)類里綁定更多的方法,這個(gè)就靠自己發(fā)揮了。
View [視圖層]
window.onload = function(){ var T = new Tree(tree); document.getElementsByTagName("body")[0].appendChild(T); }
整棵樹(shù)的構(gòu)建,主要用到的是DOM元素的處理,這個(gè)必須牢牢掌握!
到此這篇關(guān)于使用JS動(dòng)態(tài)構(gòu)建目錄樹(shù)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript點(diǎn)擊才出現(xiàn)驗(yàn)證碼
用javascript[js]實(shí)現(xiàn)的必須經(jīng)過(guò)點(diǎn)擊才能出現(xiàn)嚴(yán)重碼效果代碼2008-04-04詳解JavaScript中怎么實(shí)現(xiàn)鏈表
鏈表是一系列節(jié)點(diǎn)串聯(lián)形成的數(shù)據(jù)結(jié)構(gòu),鏈表存儲(chǔ)有序的元素集合,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的,本文給大家介紹了在JavaScript中怎么實(shí)現(xiàn)鏈表,需要的朋友可以參考下2023-12-12ajax中g(shù)et和post的說(shuō)明及使用與區(qū)別
對(duì)付亂碼我都是用過(guò)濾器做字符編碼過(guò)濾的,Get方法過(guò)濾器監(jiān)聽(tīng)不到,所以我一直喜歡使用Post方法,下面對(duì)Ajax Get和Post方法做一對(duì)比,需要了解的朋友可以 參考下2012-12-12JavaScript中子對(duì)象訪問(wèn)父對(duì)象的方式詳解
js中雖然沒(méi)有傳統(tǒng)面向?qū)ο蟮木幊陶Z(yǔ)言里子類訪問(wèn)父類的特殊語(yǔ)法,但是我們可以根據(jù)需要造一個(gè),接下來(lái)本文給大家分享在JavaScript中子對(duì)象訪問(wèn)父對(duì)象的方式,需要的朋友可以參考下2016-09-09javascript 手動(dòng)給表增加數(shù)據(jù)的小例子
這篇文章介紹了js手動(dòng)給表增加數(shù)據(jù)的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07學(xué)習(xí)使用bootstrap的modal和carousel
這篇文章主要教大家學(xué)會(huì)用bootstrap的modal和carousel,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12javascript實(shí)現(xiàn)異形滾動(dòng)輪播
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)異形滾動(dòng)輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11玩轉(zhuǎn)JavaScript OOP - 類的實(shí)現(xiàn)詳解
下面小編就為大家?guī)?lái)一篇玩轉(zhuǎn)JavaScript OOP - 類的實(shí)現(xiàn)詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06用js實(shí)現(xiàn)的檢測(cè)瀏覽器和系統(tǒng)的函數(shù)
檢測(cè)各種瀏覽器、系統(tǒng)的JS代碼2009-04-04