JS构建页面的DOM节点结构的实现代码


Posted in Javascript onDecember 09, 2011

小提示:
关于数组的concat和push方法。
两者的区别主要有:
concat是连接数组,不会修改原数组,返回值为连接后的数组,与push的重要区别是concat会展开数组的第一层子数组
push是添加数组元素。就地修改原数组,返回值为添加的新项,push不会展开传入的数组。

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]]//没有展开 
b [4,5,6,7] 
c 5//push返回新添加的项 
d [1,2,3,4,[4,5,6,7],4,5,6,7]//push未展开,concat展开

首先遍历DOM树,然后构建,结果保存形为
{ 
key_1:[{key_1_1:value_1},{key_1_1:value_1},{key_2_1:value_2}], 
key_2:[], 
key_3:[], 
key_4:[], 
}

的结构

本来想用json格式的,可是要么有重复,要么得嵌套,所以改用对象嵌套数组。
获取了结构之后,节点树基本也就确定了,直接构造成树形菜单就可以了。
当然,还是构成简单的树形菜单,见 https://3water.com/article/29100.htm
遍历和构建的函数如下:

//遍历节点 
function walkDom(el){ 
var c = el.firstChild; 
var retObj = {}; 
var array = []; 
while(c !== null){//这里只是返回了元素节点,没有节点就是个空数组 
if(c.nodeType == 1){ 
array.push(walkDom(c)); 
} 
c = c.nextSibling; 
} 
retObj[el.tagName] = array; 
return retObj; 
} //构建树形 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; 
}

下面是一个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>手机:</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"> 
//遍历节点 
function walkDom(el){ 
var c = el.firstChild; 
var retObj = {}; 
var array = []; 
while(c !== null){//这里只是返回了元素节点,没有节点就是个空数组 
if(c.nodeType == 1){ 
array.push(walkDom(c)); 
} 
c = c.nextSibling; 
} 
retObj[el.tagName] = array; 
return retObj; 
} 
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; 
} var tree = walkDom(document.body); 
var ul = document.createElement('ul'); 
ul.innerHTML = createTree(tree).join(''); 
document.body.appendChild(ul); 
</script> 
</body> 
</html>

结果如下(未美化):

JS构建页面的DOM节点结构的实现代码

Javascript 相关文章推荐
JavaScript实现网页上的浮动广告的简单方法
Jun 14 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
angular forEach方法遍历源码解读
Jan 25 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
Dec 10 Javascript
js实现图片上传到服务器和回显
Jan 19 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
Vue-cli3多页面配置详解
Mar 22 Javascript
微信小程序实现聊天室功能
Jun 14 Javascript
电子商务网站上的常用的js放大镜效果
Dec 08 #Javascript
常见JS效果之图片减速度滚动实现代码
Dec 08 #Javascript
JQuery循环滚动图片代码
Dec 08 #Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 #Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 #Javascript
js中document.getElementByid、document.all和document.layers区分介绍
Dec 08 #Javascript
基于jquery的代码显示区域自动拉长效果
Dec 07 #Javascript
You might like
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
vue cli 全面解析
2018/02/28 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
Python实现批量检测HTTP服务的状态
2016/10/27 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python 实现两个npy档案合并
2020/07/01 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
生产经理的自我评价分享
2013/11/07 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
车辆转让协议书
2014/04/15 职场文书
家长对学生的评语
2014/04/18 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python