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 相关文章推荐
JS是否可以跨文件同时控制多个iframe页面的应用技巧
Dec 16 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
jQuery中:not选择器用法实例
Dec 30 Javascript
浅谈setTimeout 与 setInterval
Jun 23 Javascript
深入剖析JavaScript:Object类型
May 10 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
Mar 21 Javascript
JavaScript实现的选择排序算法实例分析
Apr 14 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
浅析JavaScript异步代码优化
Mar 18 Javascript
Vue的生命周期操作示例
Sep 17 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
电子商务网站上的常用的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扩展函数
2006/10/09 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP类的反射用法实例
2014/11/03 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
jQuery中的常用事件总结
2009/12/27 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
深入解析Python中的集合类型操作符
2015/08/19 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
浅析PEP572: 海象运算符
2019/10/15 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
使用npy转image图像并保存的实例
2020/07/01 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
this关键字的作用
2016/01/30 面试题
法律系毕业生自荐信范文
2014/03/27 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
休学证明范本
2015/06/19 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang