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 相关文章推荐
javascript document.images实例
May 27 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
Oct 29 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
Jan 16 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
May 15 Javascript
基于JavaScript实现生成名片、链接等二维码
Sep 20 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
Aug 03 Javascript
Vue data的数据响应式到底是如何实现的
Feb 11 Javascript
vue实现简单瀑布流布局
May 28 Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 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
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
python-opencv颜色提取分割方法
2018/12/08 Python
《九寨沟》教学反思
2014/04/08 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
公司股东合作协议书
2014/09/14 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
电信营业员岗位职责
2015/04/14 职场文书
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python