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中的Document文档对象
Jan 16 Javascript
js 取时间差去掉周六周日实现代码
Dec 25 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
chrome浏览器如何断点调试异步加载的JS
Sep 05 Javascript
Javascript this 函数深入详解
Dec 13 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
Nov 22 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
详解vue的diff算法原理
May 20 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
点击按钮弹出模态框的一系列操作代码实例
Mar 29 Javascript
Vue基于localStorage存储信息代码实例
Nov 16 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
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
php中session定期自动清理的方法
2015/11/12 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
把html页面的部分内容保存成新的html文件的jquery代码
2009/11/12 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
八项规定整改措施
2014/02/12 职场文书
行政专员求职信范文
2014/05/03 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
医院合作协议书
2014/08/19 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
预备党员转正材料
2014/12/19 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
西安事变观后感
2015/06/12 职场文书
离职证明格式样本
2015/06/12 职场文书
日元符号 ¥
2022/02/17 杂记
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS