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 实现表单验证功能代码(简洁)
Jul 03 Javascript
javascript 终止函数执行操作
Feb 14 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
jquery text()方法取标签中的文本
Jul 25 Javascript
JavaScript操作cookie类实例
Mar 31 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
Nov 02 Javascript
Js 获取、判断浏览器版本信息的简单方法
Aug 08 Javascript
js改变html的原有内容实现方法
Oct 05 Javascript
jquery一键控制checkbox全选、反选或全不选
Oct 16 jQuery
jQuery实现的下雪动画效果示例【附源码下载】
Feb 02 jQuery
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 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中常量,变量的作用域和生存周期
2013/08/10 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
vue-loader教程介绍
2017/06/14 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
python实现批量文件重命名
2019/10/31 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
小学清明节活动方案
2014/03/08 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL