一个简单的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 相关文章推荐
javascript下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
深入理解JavaScript定时机制
Oct 27 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
vue刷新和tab切换实例
Feb 11 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
原生JS实现无缝轮播图片
Jun 24 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 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获取某个目录大小的代码
2008/09/10 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
keras得到每层的系数方式
2020/06/15 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
中专生学习生活的自我评价分享
2013/10/27 职场文书
童装店创业计划书
2014/01/09 职场文书
创业计划书撰写原则
2014/01/25 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
新闻学专业求职信
2014/07/28 职场文书
服务员岗位职责
2015/02/03 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
学校运动会加油词
2015/07/18 职场文书