js一般方法改写成面向对象方法的无限级折叠菜单示例代码


Posted in Javascript onJuly 04, 2013

本例是应用别人的例子,原来那位老兄是用一般方法写成的无限级折叠菜单,在此先感谢他!后来我就通过了一些简化修改,将原来的例子改成了面向对象的方式,实例中的展开与闭合的小图标可以自己重新添加,从而更好的查看效果。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>很实用的JS+CSS多级树形展开菜单</title> 
<style type="text/css"> 
body{margin:0;padding:0;font:12px/1.5 Tahoma,Helvetica,Arial,sans-serif;} 
ul,li,{margin:0;padding:0;} 
ul{list-style:none;} 
a{text-decoration: none;} 
#root{margin:10px;width:200px;overflow:hidden;} 
#root li{line-height:25px;} 
#root .rem{padding-left:16px;} 
#root .add{background:url(treeico.gif) -4px -31px no-repeat;} 
#root .ren{background:url(treeico.gif) -4px -7px no-repeat;} 
#root li a{color:#666666;padding-left:5px;outline:none;blr:expression(this.onFocus=this.blur());} 
#root .two{padding-left:20px;display:none;} 
</style> 
</head> 
<body> 
<ul id="root"> 
<li> 
<label><a href="javascript:;">校讯通</a></label> 
<ul class="two"> 
<li> 
<label><a href="javascript:;">沈阳市</a></label> 
<ul class="two"> 
<li> 
<label><a href="javascript:;">二小</a></label> 
<ul class="two"> 
<li><label><a href="javascript:;">二年级</a></label></li> 
<li> 
<label><a href="javascript:;">三年级</a></label> 
<ul class="two"> 
<li> 
<label><a href="javascript:;">一班</a></label> 
<ul class="two"> 
<li><label><a href="javascript:;">张三</a></label></li> 
<li> 
<label><a href="javascript:;">王五</a></label> 
<ul class="two"> 
<li><label><a href="javascript:;">班长</a></label></li> 
<li><label><a href="javascript:;">学习委员</a></label></li> 
</ul> 
</li> 
</ul> 
</li> 
<li><label><a href="javascript:;">实验班</a></label></li> 
</ul> 
</li> 
</ul> 
</li> 
</ul> 
</li> 
<li> 
<label><a href="javascript:;">抚顺市</a></label> 
<ul class="two"> 
<li><label><a href="javascript:;">二小</a></label></li> 
<li><label><a href="javascript:;">一中</a></label></li> 
</ul> 
</li> 
</ul> 
</li> 
</ul> 
<script type="text/javascript" > 
/**一般JS方法 
function addEvent(el,name,fn){//绑定事件 
if(el.addEventListener) return el.addEventListener(name,fn,false); 
return el.attachEvent('on'+name,fn); 
} 
function nextnode(node){//寻找下一个兄弟并剔除空的文本节点 
if(!node)return ; 
if(node.nodeType == 1) 
return node; 
if(node.nextSibling) 
return nextnode(node.nextSibling); 
} 
function prevnode(node){//寻找上一个兄弟并剔除空的文本节点 
if(!node)return ; 
if(node.nodeType == 1) 
return node; 
if(node.previousSibling) 
return prevnode(node.previousSibling); 
} 
addEvent(document.getElementById('root'),'click',function(e){//绑定点击事件,使用root根元素代理 
e = e||window.event; 
var target = e.target||e.srcElement; 
var tp = nextnode(target.parentNode.nextSibling); 
switch(target.nodeName){ 
case 'A'://点击A标签展开和收缩树形目录,并改变其样式 
if(tp&&tp.nodeName == 'UL'){ 
if(tp.style.display != 'block' ){ 
tp.style.display = 'block'; 
prevnode(target.parentNode.previousSibling).className = 'ren' 
}else{ 
tp.style.display = 'none'; 
prevnode(target.parentNode.previousSibling).className = 'add' 
} 
} 
break; 
case 'SPAN'://点击图标只展开或者收缩 
var ap = nextnode(nextnode(target.nextSibling).nextSibling); 
if(ap.style.display != 'block' ){ 
ap.style.display = 'block'; 
target.className = 'ren' 
}else{ 
ap.style.display = 'none'; 
target.className = 'add' 
} 
break; 
} 
}); 
window.onload = function(){//页面加载时给有孩子结点的元素动态添加图标 
var labels = document.getElementById('root').getElementsByTagName('label'); 
for(var i=0;i<labels.length;i++){ 
var span = document.createElement('span'); 
span.style.cssText ='display:inline-block;height:18px;vertical-align:middle;width:16px;cursor:pointer;'; 
span.innerHTML = ' ' 
span.className = 'add'; 
if(nextnode(labels[i].nextSibling)&&nextnode(labels[i].nextSibling).nodeName == 'UL') 
labels[i].parentNode.insertBefore(span,labels[i]); 
else 
labels[i].className = 'rem' 
} 
} 
**/ 
//面向对象方法 
var Tree = function(o){ 
this.root = document.getElementById(o); 
this.labels = this.root.getElementsByTagName('label'); 
var that = this; 
this.int(); 
Tree.prototype.addEvent(this.root,'click',function(e){that.treeshow(e)}); 
} 
Tree.prototype = { 
int:function(){//初始化页面,加载时给有孩子结点的元素动态添加图标 
for(var i=0;i<this.labels.length;i++){ 
var span = document.createElement('span'); 
span.style.cssText ='display:inline-block;height:18px;vertical-align:middle;width:16px;cursor:pointer;'; 
span.innerHTML = ' ' 
span.className = 'add'; 
if(this.nextnode(this.labels[i].nextSibling)&&this.nextnode(this.labels[i].nextSibling).nodeName == 'UL') 
this.labels[i].parentNode.insertBefore(span,this.labels[i]); 
else 
this.labels[i].className = 'rem' 
} 
}, 
treeshow:function(e){ 
e = e||window.event; 
var target = e.target||e.srcElement; 
var tp = this.nextnode(target.parentNode.nextSibling); 
switch(target.nodeName){ 
case 'A'://点击A标签展开和收缩树形目录,并改变其样式 
if(tp&&tp.nodeName == 'UL'){ 
if(tp.style.display != 'block' ){ 
tp.style.display = 'block'; 
this.prevnode(target.parentNode.previousSibling).className = 'ren' 
}else{ 
tp.style.display = 'none'; 
this.prevnode(target.parentNode.previousSibling).className = 'add' 
} 
} 
break; 
case 'SPAN'://点击图标只展开或者收缩 
var ap = this.nextnode(this.nextnode(target.nextSibling).nextSibling); 
if(ap.style.display != 'block' ){ 
ap.style.display = 'block'; 
target.className = 'ren' 
}else{ 
ap.style.display = 'none'; 
target.className = 'add' 
} 
break; 
} 
}, 
addEvent:function(el,name,fn){//绑定事件 
if(el.addEventListener) return el.addEventListener(name,fn,false); 
return el.attachEvent('on'+name,fn); 
}, 
nextnode:function(node){//寻找下一个兄弟并剔除空的文本节点 
if(!node)return ; 
if(node.nodeType == 1) 
return node; 
if(node.nextSibling) 
return this.nextnode(node.nextSibling); 
}, 
prevnode:function(node){//寻找上一个兄弟并剔除空的文本节点 
if(!node)return ; 
if(node.nodeType == 1) 
return node; 
if(node.previousSibling) 
return prevnode(node.previousSibling); 
} 
} 
tree = new Tree("root");//实例化应用 
</script> 
</body> 
</html>
Javascript 相关文章推荐
一段非常简单的让图片自动切换js代码
Nov 10 Javascript
一个可以显示阴历的JS代码
Mar 05 Javascript
如何使用jquery动态加载js,css文件实现代码
Apr 03 Javascript
JavaScript中的操作符==与===介绍
Dec 31 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
Nov 22 Javascript
详解如何使用webpack打包Vue工程
May 27 Javascript
老生常谈js中的MVC
Jul 25 Javascript
利用JS实现scroll自定义滚动效果详解
Oct 17 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
详解vantUI框架在vue项目中的应用踩坑
Dec 06 Javascript
简单实用jquery版三级联动select示例
Jul 04 #Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 #Javascript
js将控件隐藏的方法及display属性介绍
Jul 04 #Javascript
Jquery多选框互相内容交换的实例代码
Jul 04 #Javascript
js局部刷新页面时间具体实现
Jul 04 #Javascript
Jquery倒数计时按钮setTimeout的实例代码
Jul 04 #Javascript
javascript闭包的高级使用方法实例
Jul 04 #Javascript
You might like
GD输出汉字的函数的分析
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
JS array 数组详解
2009/03/22 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python正则表达式介绍
2012/08/06 Python
python图像处理之镜像实现方法
2015/05/30 Python
深入理解python函数递归和生成器
2016/06/06 Python
Python全局变量用法实例分析
2016/07/19 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
在python中做正态性检验示例
2019/12/09 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
档案管理员岗位职责
2013/12/01 职场文书
财务人员个人工作总结
2015/02/27 职场文书
自我评价优缺点范文
2015/03/11 职场文书
阿凡达观后感
2015/06/10 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript