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 相关文章推荐
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
Nov 17 Javascript
让图片旋转任意角度及JQuery插件使用介绍
Mar 20 Javascript
验证码按回车不变解决方法
Mar 29 Javascript
js调用AJAX时Get和post的乱码解决方法
Jun 04 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
javaScript基础详解
Jan 19 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
微信小程序 数据缓存实现方法详解
Aug 26 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
Wordpress php 分页代码
2009/10/21 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
JavaScript按位运算符的应用简析
2014/02/04 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
JavaScript错误处理
2015/02/03 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python实现名片管理系统
2020/02/14 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
.NET面试问题集
2015/12/08 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
学生意外伤害赔偿协议书
2014/09/17 职场文书
婚内分居协议书范文
2014/11/26 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers