一个简单的js树形菜单


Posted in Javascript onDecember 09, 2011

我练习一下,以免不时之需。

树形菜单不过就是把普通菜单重新排列一下,看起来像树形而已。

一个简单的js树形菜单

上图京东的菜单,给他多几个嵌套,然后添加收缩伸展事件,差不多就行了。

给个例子:

<!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"> 
body{ font-size: 12px;} 
h2,h3{ margin: 0;} 
ul{ margin: 0; padding: 0; list-style: none; } 
#outer_wrap li{ padding-left: 30px; line-height: 24px;} 
.controlSymbol{ padding: 0 5px; border: 1px solid #adff2f; cursor: pointer;} 
</style> 
</head> 
<body> 
<ul id="outer_wrap"> 
<li> 
<h2>标题1</h2> 
<ul> 
<li>内容1</li> 
<li>内容2</li> 
<li>内容3</li> 
<li>内容4</li> 
<li> 
<h3>标题1_1</h3> 
<ul> 
<li>内容1_1</li> 
<li>内容1_2</li> 
<li>内容1_3</li> 
<li>内容1_4</li> 
</ul> 
</li> 
<li> 
<h3>标题1_2</h3> 
<ul> 
<li>内容1_1</li> 
<li>内容1_2</li> 
<li>内容1_3</li> 
<li>内容1_4</li> 
</ul> 
</li> 
</ul> 
</li> 
</ul> 
</body> 
</html>

然后添加事件:
var innerText = document.innerText ? 'innerText' : 'textContent'; 
var span = document.createElement('span'); 
span[innerText] = '-'; 
span.className = 'controlSymbol'; function $(id){ 
return document.getElementById(id); 
} 
function $_(){ 
var args = arguments; 
var ret = []; 
for(var i = 0; i < args.length; i++){ 
var temp = document.getElementsByTagName(args[i]); 
try{ 
ret = ret.concat(Array.prototype.slice.call(temp,0)); 
}catch(e){ 
for(var j = 0; j < temp.length; j++){ 
ret.push(temp[j]); 
} 
} 
} 
return ret; 
} 
function addSymbol(h){ 
var innerSpan = span.cloneNode(true); 
h.insertBefore(innerSpan,h.firstChild); 
} 
function next(el){ 
while(el.nextSibling){ 
if(el.nextSibling.nodeType == 1){ 
return el.nextSibling; 
} 
el = el.nextSibling; 
} 
return null; 
} 
var outerWrap = $('outer_wrap'); 
var hs = $_('h2','h3'); 
for(var i = 0 ; i < hs.length; i++){ 
addSymbol(hs[i]); 
} 
outerWrap.onclick = function(event){ 
event = event || window.event; 
var t = event.target || event.srcElement; 
if(t.className == 'controlSymbol'){ 
var sn = next(t.parentNode); 
var snStyle = next(t.parentNode).style; 
snStyle.display = (snStyle.display == 'block' || snStyle.display == '') ? 'none' : 'block'; 
t[innerText] = t[innerText] == '+' ? '-':'+'; 
} 
}

不过用的多的可能是动态的添加菜单,也就是动态的生成HTML序列。

一个例子:

var tree = { 
'标题2':[ 
'内容1', 
'内容2', 
'内容3', 
'内容4', 
{'标题2_1':['内容2_1','内容2_2','内容2_3','内容2_4']}, 
{'标题2_2':['内容2_1','内容2_2','内容2_3','内容2_4']}, 
'内容5' 
] 
} 
var fragment = document.createElement('ul'); 
function concatTree(tree){ 
var array = []; 
for(var key in tree){ 
array.push('<li><h3>'); 
array.push(key); 
array.push('</h3><ul>'); 
for(var i = 0; i < tree[key].length; i++){ 
if(tree[key][i].constructor == Object){ 
array = array.concat(concatTree(tree[key][i])); 
}else{ 
array.push('<li>'); 
array.push(tree[key][i]); 
array.push('</li>'); 
} 
} 
array.push('</ul></li>'); 
} 
return array; 
} 
fragment.innerHTML = concatTree(tree).join(''); 
$('outer_wrap').appendChild(fragment.firstChild);

像上面的方法也可以用来生成表格,扯远了,比如
var oArray = { 
thead : ['标题一','标题二','标题三','标题四'], 
tbody : [ 
[1,2,3,4], 
[5,6,7,8], 
[9,10,11,12], 
[13,14,15,16], 
[17,18,19,20], 
[21,22,23,24] 
], 
tfoot : [25,26,27,28] 
} 
function createTable(arr){ 
var html = []; 
html.push('<table>'); 
for(var key in arr){ 
html.push('<'+key + '>'); 
if(key == 'thead'){ 
assemTag(arr[key],html,'th') 
}else if(key == 'tfoot'){ 
assemTag(arr[key],html,'td') 
}else if(key == 'tbody'){ 
for(var k = 0, len_1 = arr[key].length; k < len_1; k++){ 
assemTag(arr[key][k],html,'td') 
} 
} 
html.push('</'+key + '>'); 
} 
html.push('</table>'); 
var temp = document.createElement('div'); 
temp.innerHTML = html.join(''); 
return temp.firstChild; 
} 
function assemTag(array,html,tag){ 
html.push('<tr>'); 
var s = '<' + tag + '>'; 
var e = '</' + tag + '>'; 
for(var j = 0, len = array.length; j < len; j++){ 
html.push(s); 
html.push(array[j]); 
html.push(e); 
} 
html.push('</tr>'); 
} 
document.body.appendChild(createTable(oArray));

一般可以直接创建一个节点元素,然后直接设置innerHTML,不过innerHTML虽说是IE先搞起的,但是IE又最不彻底,对于table和tr是不可设置innerHTML的(只读),所以只能假div之手了。
Javascript 相关文章推荐
奇妙的js
Sep 24 Javascript
Javascript typeof 用法
Dec 28 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
jquery实现checkbox 全选/全不选的通用写法
Feb 22 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
Aug 10 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
json传值以及ajax接收详解
May 24 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 Javascript
Electron 调用命令行(cmd)
Sep 23 Javascript
JS构建页面的DOM节点结构的实现代码
Dec 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
You might like
php随机显示图片的简单示例
2014/02/15 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
20条学习javascript的编程规范的建议
2014/11/28 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
django迁移文件migrations的实现
2020/03/31 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
竞选演讲稿范文
2013/12/28 职场文书
高考备战决心书
2014/03/11 职场文书
市场营销调查计划书
2014/05/02 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
红白喜事主持词
2015/07/06 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Redis高可用集群redis-cluster详解
2022/03/20 Redis