JS構(gòu)建頁(yè)面的DOM節(jié)點(diǎn)結(jié)構(gòu)的實(shí)現(xiàn)代碼
更新時(shí)間:2011年12月09日 00:47:51 作者:
本來(lái)想用json格式的,可是要么有重復(fù),要么得嵌套,所以改用對(duì)象嵌套數(shù)組
小提示:
關(guān)于數(shù)組的concat和push方法。
兩者的區(qū)別主要有:
concat是連接數(shù)組,不會(huì)修改原數(shù)組,返回值為連接后的數(shù)組,與push的重要區(qū)別是concat會(huì)展開(kāi)數(shù)組的第一層子數(shù)組
push是添加數(shù)組元素。就地修改原數(shù)組,返回值為添加的新項(xiàng),push不會(huì)展開(kāi)傳入的數(shù)組。
var a = [1,2,3,4];
var b = [4,5,6,7];
var c = a.push(b);
var d = a.concat(b);
console.log('a',a);
console.log('b',b);
console.log('c',c);
console.log('d',d);
//輸出:
a [1,2,3,4,[4,5,6,7]]//沒(méi)有展開(kāi)
b [4,5,6,7]
c 5//push返回新添加的項(xiàng)
d [1,2,3,4,[4,5,6,7],4,5,6,7]//push未展開(kāi),concat展開(kāi)
首先遍歷DOM樹(shù),然后構(gòu)建,結(jié)果保存形為
{
key_1:[{key_1_1:value_1},{key_1_1:value_1},{key_2_1:value_2}],
key_2:[],
key_3:[],
key_4:[],
}
的結(jié)構(gòu)
本來(lái)想用json格式的,可是要么有重復(fù),要么得嵌套,所以改用對(duì)象嵌套數(shù)組。
獲取了結(jié)構(gòu)之后,節(jié)點(diǎn)樹(shù)基本也就確定了,直接構(gòu)造成樹(shù)形菜單就可以了。
當(dāng)然,還是構(gòu)成簡(jiǎn)單的樹(shù)形菜單,見(jiàn) http://www.dhdzp.com/article/29100.htm
遍歷和構(gòu)建的函數(shù)如下:
//遍歷節(jié)點(diǎn)
function walkDom(el){
var c = el.firstChild;
var retObj = {};
var array = [];
while(c !== null){//這里只是返回了元素節(jié)點(diǎn),沒(méi)有節(jié)點(diǎn)就是個(gè)空數(shù)組
if(c.nodeType == 1){
array.push(walkDom(c));
}
c = c.nextSibling;
}
retObj[el.tagName] = array;
return retObj;
} //構(gòu)建樹(shù)形 function createTree(tree){
var array = [];
for(var key in tree){
array.push('<li><h3>');
array.push(key.toLowerCase());
array.push('</h3>');
if(tree[key].length != 0){
array.push('<ul>');
for(var i = 0; i < tree[key].length; i++){
array = array.concat(createTree(tree[key][i]));
}
array.push('</ul>');
}
array.push('</li>');
}
return array;
}
下面是一個(gè)demo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{ margin: 0; padding: 0;}
body{ line-height: 24px; font-size: 12px;}
ul{ list-style: none;}
ul li{ padding-left: 30px;}
</style>
</head>
<body>
<div id="header">頭部</div>
<div id="container">
<h2>第一部分</h2>
<form action="" id="form_1">
<p><label>姓名:</label><input type="text" /></p>
<p><label>年齡:</label><input type="text" /></p>
<p><input type="submit" value="提交"/></p>
</form>
<form action="">
<p><label>手機(jī):</label><input type="text" /></p>
<p><label>郵編:</label><input type="text" /></p>
<p><input type="submit" value="保存"/></p>
</form>
</div>
<div id="footer">腳部</div>
<script type="text/javascript">
//遍歷節(jié)點(diǎn)
function walkDom(el){
var c = el.firstChild;
var retObj = {};
var array = [];
while(c !== null){//這里只是返回了元素節(jié)點(diǎn),沒(méi)有節(jié)點(diǎn)就是個(gè)空數(shù)組
if(c.nodeType == 1){
array.push(walkDom(c));
}
c = c.nextSibling;
}
retObj[el.tagName] = array;
return retObj;
}
function createTree(tree){//構(gòu)建樹(shù)形
var array = [];
for(var key in tree){
array.push('<li><h3>');
array.push(key.toLowerCase());
array.push('</h3>');
if(tree[key].length != 0){
array.push('<ul>');
for(var i = 0; i < tree[key].length; i++){
array = array.concat(createTree(tree[key][i]));
}
array.push('</ul>');
}
array.push('</li>');
}
return array;
}
var tree = walkDom(document.body);
var ul = document.createElement('ul');
ul.innerHTML = createTree(tree).join('');
document.body.appendChild(ul);
</script>
</body>
</html>
結(jié)果如下(未美化):
關(guān)于數(shù)組的concat和push方法。
兩者的區(qū)別主要有:
concat是連接數(shù)組,不會(huì)修改原數(shù)組,返回值為連接后的數(shù)組,與push的重要區(qū)別是concat會(huì)展開(kāi)數(shù)組的第一層子數(shù)組
push是添加數(shù)組元素。就地修改原數(shù)組,返回值為添加的新項(xiàng),push不會(huì)展開(kāi)傳入的數(shù)組。
復(fù)制代碼 代碼如下:
var a = [1,2,3,4];
var b = [4,5,6,7];
var c = a.push(b);
var d = a.concat(b);
console.log('a',a);
console.log('b',b);
console.log('c',c);
console.log('d',d);
//輸出:
a [1,2,3,4,[4,5,6,7]]//沒(méi)有展開(kāi)
b [4,5,6,7]
c 5//push返回新添加的項(xiàng)
d [1,2,3,4,[4,5,6,7],4,5,6,7]//push未展開(kāi),concat展開(kāi)
首先遍歷DOM樹(shù),然后構(gòu)建,結(jié)果保存形為
復(fù)制代碼 代碼如下:
{
key_1:[{key_1_1:value_1},{key_1_1:value_1},{key_2_1:value_2}],
key_2:[],
key_3:[],
key_4:[],
}
的結(jié)構(gòu)
本來(lái)想用json格式的,可是要么有重復(fù),要么得嵌套,所以改用對(duì)象嵌套數(shù)組。
獲取了結(jié)構(gòu)之后,節(jié)點(diǎn)樹(shù)基本也就確定了,直接構(gòu)造成樹(shù)形菜單就可以了。
當(dāng)然,還是構(gòu)成簡(jiǎn)單的樹(shù)形菜單,見(jiàn) http://www.dhdzp.com/article/29100.htm
遍歷和構(gòu)建的函數(shù)如下:
復(fù)制代碼 代碼如下:
//遍歷節(jié)點(diǎn)
function walkDom(el){
var c = el.firstChild;
var retObj = {};
var array = [];
while(c !== null){//這里只是返回了元素節(jié)點(diǎn),沒(méi)有節(jié)點(diǎn)就是個(gè)空數(shù)組
if(c.nodeType == 1){
array.push(walkDom(c));
}
c = c.nextSibling;
}
retObj[el.tagName] = array;
return retObj;
} //構(gòu)建樹(shù)形 function createTree(tree){
var array = [];
for(var key in tree){
array.push('<li><h3>');
array.push(key.toLowerCase());
array.push('</h3>');
if(tree[key].length != 0){
array.push('<ul>');
for(var i = 0; i < tree[key].length; i++){
array = array.concat(createTree(tree[key][i]));
}
array.push('</ul>');
}
array.push('</li>');
}
return array;
}
下面是一個(gè)demo:
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{ margin: 0; padding: 0;}
body{ line-height: 24px; font-size: 12px;}
ul{ list-style: none;}
ul li{ padding-left: 30px;}
</style>
</head>
<body>
<div id="header">頭部</div>
<div id="container">
<h2>第一部分</h2>
<form action="" id="form_1">
<p><label>姓名:</label><input type="text" /></p>
<p><label>年齡:</label><input type="text" /></p>
<p><input type="submit" value="提交"/></p>
</form>
<form action="">
<p><label>手機(jī):</label><input type="text" /></p>
<p><label>郵編:</label><input type="text" /></p>
<p><input type="submit" value="保存"/></p>
</form>
</div>
<div id="footer">腳部</div>
<script type="text/javascript">
//遍歷節(jié)點(diǎn)
function walkDom(el){
var c = el.firstChild;
var retObj = {};
var array = [];
while(c !== null){//這里只是返回了元素節(jié)點(diǎn),沒(méi)有節(jié)點(diǎn)就是個(gè)空數(shù)組
if(c.nodeType == 1){
array.push(walkDom(c));
}
c = c.nextSibling;
}
retObj[el.tagName] = array;
return retObj;
}
function createTree(tree){//構(gòu)建樹(shù)形
var array = [];
for(var key in tree){
array.push('<li><h3>');
array.push(key.toLowerCase());
array.push('</h3>');
if(tree[key].length != 0){
array.push('<ul>');
for(var i = 0; i < tree[key].length; i++){
array = array.concat(createTree(tree[key][i]));
}
array.push('</ul>');
}
array.push('</li>');
}
return array;
}
var tree = walkDom(document.body);
var ul = document.createElement('ul');
ul.innerHTML = createTree(tree).join('');
document.body.appendChild(ul);
</script>
</body>
</html>
結(jié)果如下(未美化):

您可能感興趣的文章:
- JavaScript DOM節(jié)點(diǎn)操作方法總結(jié)
- JS實(shí)現(xiàn)動(dòng)態(tài)添加DOM節(jié)點(diǎn)和事件的方法示例
- JavaScript中對(duì)DOM節(jié)點(diǎn)的訪問(wèn)、創(chuàng)建、修改、刪除
- js和jquery對(duì)dom節(jié)點(diǎn)的操作(創(chuàng)建/追加)
- JS常見(jiàn)DOM節(jié)點(diǎn)操作示例【創(chuàng)建 ,插入,刪除,復(fù)制,查找】
- JS實(shí)現(xiàn)DOM節(jié)點(diǎn)插入操作之子節(jié)點(diǎn)與兄弟節(jié)點(diǎn)插入操作示例
- JavaScript DOM節(jié)點(diǎn)添加示例
- JS訪問(wèn)DOM節(jié)點(diǎn)方法詳解
- JavaScript DOM節(jié)點(diǎn)操作實(shí)例小結(jié)(新建,刪除HTML元素)
- [js高手之路]HTML標(biāo)簽解釋成DOM節(jié)點(diǎn)的實(shí)現(xiàn)方法
- 原生js實(shí)現(xiàn)針對(duì)Dom節(jié)點(diǎn)的CRUD操作示例
相關(guān)文章
JavaScript程序員應(yīng)該知道的45個(gè)實(shí)用技巧
在這篇文章中,我將分享一組JavaScript的技巧、竅門和最佳實(shí)踐,這些都是JavaScript程序員應(yīng)該知曉的,不管他們是使用在瀏覽器/引擎上,還是服務(wù)器端(SSJS——Service Side JavaScript)JavaScript解釋器上2014-03-03
javascript 關(guān)于# 和 void的區(qū)別分析
href 為#的跳到了自己的頁(yè)面。原來(lái)‘#’代表的是 #top ,2009-10-10
使用BroadcastChannel進(jìn)行跨窗口通信的實(shí)例詳解
BroadcastChannel 提供了一種簡(jiǎn)單而有效的方式來(lái)實(shí)現(xiàn)同一瀏覽器環(huán)境下不同頁(yè)面或腳本之間的通信,對(duì)于需要跨窗口、標(biāo)簽頁(yè)或 iframe 同步數(shù)據(jù)的應(yīng)用場(chǎng)景,它是一種非常便捷的解決方案,本文介紹了如何使用 BroadcastChannel 進(jìn)行跨窗口通信,需要的朋友可以參考下2024-08-08
ie下動(dòng)態(tài)加態(tài)js文件的方法
接觸過(guò)相關(guān)知識(shí)的都知道,動(dòng)態(tài)向DOM中添加js的script標(biāo)簽時(shí),在各種瀏覽器下會(huì)有不同的表現(xiàn)。2011-09-09
微信小程序?qū)崿F(xiàn)音樂(lè)播放頁(yè)面布局
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)京東商品分類側(cè)邊欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
JS動(dòng)態(tài)插入腳本和插入引用外部鏈接腳本的方法
js 動(dòng)態(tài)插入腳本的是在頁(yè)面加載時(shí)不存在,但將來(lái)的某一時(shí)刻通過(guò)修改該 DOM 動(dòng)態(tài)添加的腳本。接下來(lái)通過(guò)本文給大家介紹JS動(dòng)態(tài)插入腳本和插入引用外部鏈接腳本,需要的朋友可以參考下2018-05-05
原生js簡(jiǎn)單實(shí)現(xiàn)放大鏡特效
這篇文章主要為大家詳細(xì)介紹了原生js簡(jiǎn)單實(shí)現(xiàn)放大鏡特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
JavaScript實(shí)現(xiàn)的九種排序算法
這篇文章主要給大家介紹了關(guān)于利用JavaScript實(shí)現(xiàn)的九種排序算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
javascript原始值和對(duì)象引用實(shí)例分析
這篇文章主要介紹了javascript原始值和對(duì)象引用的方法,實(shí)例分析了javascript原始值和對(duì)象引用的功能、定義與相關(guān)技巧,需要的朋友可以參考下2015-04-04

