一个简单的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 相关文章推荐
IE与firefox之jquery用法区别
Oct 03 Javascript
jQuery性能优化28条建议你值得借鉴
Feb 16 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 Javascript
理解javascript中的Function.prototype.bind的方法
Feb 03 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
微信小程序scroll-view组件实现滚动动画
Jan 31 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
Nov 29 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 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面向对象的使用教程 简单数据库连接
2006/11/25 PHP
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
windows下python安装小白入门教程
2018/09/18 Python
Python File(文件) 方法整理
2019/02/18 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
附答案的Java面试题
2012/11/19 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
小学美术教学反思
2014/02/01 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
保研推荐信
2014/05/09 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
介绍信怎么写
2015/05/05 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
Python中for后接else的语法使用
2021/05/18 Python
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
django 认证类配置实现
2021/11/11 Python
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python