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封装的一个js分页
Nov 15 Javascript
ajax提交表单实现网页无刷新注册示例
May 08 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
同一个网页中实现多个JavaScript特效的方法
Feb 02 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
Oct 28 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
Mar 22 Javascript
详解Node.Js如何处理post数据
Sep 19 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
Vue-cli3简单使用(图文步骤)
Apr 30 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 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+mysql 实现身份验证代码
2010/03/24 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
Angularjs 基础入门
2014/12/26 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
小结Python的反射机制
2020/09/28 Python
python 实现汉诺塔游戏
2020/11/28 Python
python math模块的基本使用教程
2021/01/16 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
宾馆仓管员岗位职责
2014/07/27 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
工作会议通知
2015/04/15 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
理解python中装饰器的作用
2021/07/21 Python
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电