当前位置: 首页 > news >正文

js实现无限级树形导航列表

代码简介:

js实现无限级树形下拉导航菜单,简洁实用,用到一个已封装好的JS类,有用的大家借鉴一下。

代码内容:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>js实现无限级树形导航列表_网页代码站(www.webdm.cn)</title>
</head>
<body>
<style type="text/css"> 
    *{ margin:0; padding:0;    list-style:none;} 
    body { margin:20px;} 
    h2 { font-family:"黑体"; font-size:24px; text-align:center; line-height:32px;} 
    h5 { font-size:12px; text-align:center; font-weight:normal; color:#666; line-height:28px;} 
    #nav a { text-decoration:underline;color:#06c; font-size:14px; line-height:24px;} 
    #nav ul{ margin-bottom:5px;} 
    #nav strong{ color:#696;} 
    #nav.dyn li ul{ display:none;} 
    #nav.dyn li ul.show{ display:block;} 
    #nav.dyn li{ padding-left:15px;} 
    #nav.dyn li.parent{    background:url(http://www.webdm.cn/images/20100422/user_23.gif) 5px 10px no-repeat;} 
    #nav.dyn li.open{ background:url(http://www.webdm.cn/images/20100422/user_23.gif) 5px -34px no-repeat;} 
    </style> 
<script type="text/javascript">
DOMhelp={
	debugWindowId:'DOMhelpdebug',
	init:function(){
		if(!document.getElementById || !document.createTextNode){return;}
	},
	lastSibling:function(node){
		var tempObj=node.parentNode.lastChild;
		while(tempObj.nodeType!=1 && tempObj.previousSibling!=null){
			tempObj=tempObj.previousSibling;
		}
		return (tempObj.nodeType==1)?tempObj:false;
	},
	firstSibling:function(node){
		var tempObj=node.parentNode.firstChild;
		while(tempObj.nodeType!=1 && tempObj.nextSibling!=null){
			tempObj=tempObj.nextSibling;
		}
		return (tempObj.nodeType==1)?tempObj:false;
	},
	getText:function(node){
		if(!node.hasChildNodes()){return false;}
		var reg=/^\s+$/;
		var tempObj=node.firstChild;
		while(tempObj.nodeType!=3 && tempObj.nextSibling!=null || reg.test(tempObj.nodeValue)){
			tempObj=tempObj.nextSibling;
		}
		return tempObj.nodeType==3?tempObj.nodeValue:false;
	},
	setText:function(node,txt){
		if(!node.hasChildNodes()){return false;}
		var reg=/^\s+$/;
		var tempObj=node.firstChild;
		while(tempObj.nodeType!=3 && tempObj.nextSibling!=null || reg.test(tempObj.nodeValue)){
			tempObj=tempObj.nextSibling;
		}
		if(tempObj.nodeType==3){tempObj.nodeValue=txt}else{return false;}
	},
	createLink:function(to,txt){
		var tempObj=document.createElement('a');
		tempObj.appendChild(document.createTextNode(txt));
		tempObj.setAttribute('href',to);
		return tempObj;
	},
	createTextElm:function(elm,txt){
		var tempObj=document.createElement(elm);
		tempObj.appendChild(document.createTextNode(txt));
		return tempObj;
	},
	closestSibling:function(node,direction){
		var tempObj;
		if(direction==-1 && node.previousSibling!=null){
			tempObj=node.previousSibling;
			while(tempObj.nodeType!=1 && tempObj.previousSibling!=null){
				 tempObj=tempObj.previousSibling;
			}
		}else if(direction==1 && node.nextSibling!=null){
			tempObj=node.nextSibling;
			while(tempObj.nodeType!=1 && tempObj.nextSibling!=null){
				 tempObj=tempObj.nextSibling;
			}
		}
		return tempObj.nodeType==1?tempObj:false;
	},
	initDebug:function(){
		if(DOMhelp.debug){DOMhelp.stopDebug();}
		DOMhelp.debug=document.createElement('div');
		DOMhelp.debug.setAttribute('id',DOMhelp.debugWindowId);
		document.body.insertBefore(DOMhelp.debug,document.body.firstChild);
	},
	setDebug:function(bug){
		if(!DOMhelp.debug){DOMhelp.initDebug();}
		DOMhelp.debug.innerHTML+=bug+'\n';
	},
	stopDebug:function(){
		if(DOMhelp.debug){
			DOMhelp.debug.parentNode.removeChild(DOMhelp.debug);
			DOMhelp.debug=null;
		}
	},
	getKey:function(e){
		if(window.event){
	      var key = window.event.keyCode;
	    } else if(e){
	      var key=e.keyCode;
	    }
		return key;
	},
/* helper methods */
	getTarget:function(e){
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target){return false;}
		while(target.nodeType!=1 && target.nodeName.toLowerCase()!='body'){
			target=target.parentNode;
		}
		return target;
	},
	stopBubble:function(e){
		if(window.event && window.event.cancelBubble){
			window.event.cancelBubble = true;
		} 
		if (e && e.stopPropagation){
			e.stopPropagation();
		}
	},
	stopDefault:function(e){
		if(window.event && window.event.returnValue){
			window.event.returnValue = false;
		} 
		if (e && e.preventDefault){
			e.preventDefault();
		}
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener){
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!DOMhelp.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!DOMhelp.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				var found=false;
				var temparray=o.className.split(' ');
				for(var i=0;i<temparray.length;i++){
					if(temparray[i]==c1){found=true;}
				}
				return found;
			break;
		}
	},
    safariClickFix:function(){
      return false;
    }
}
DOMhelp.addEvent(window, 'load', DOMhelp.init, false);
</script> 
<script type="text/javascript"> 
<!-- 
sn={ 
    dynamicClass:'dyn', 
    showClass:'show', 
    parentClass:'parent', 
    openClass:'open', 
    navID:'nav', 
    init:function(){ 
        var triggerLink; 
        if(!document.getElementById || !document.createTextNode){return;} 
        var nav=document.getElementById(sn.navID); 
        if(!nav){return;} 
        DOMhelp.cssjs('add',nav,sn.dynamicClass);         
        var nested=nav.getElementsByTagName('ul'); 
        for(var i=0;i<nested.length;i++){ 
            triggerLink=nested[i].parentNode.getElementsByTagName('a')[0]; 
            DOMhelp.cssjs('add',triggerLink.parentNode,sn.parentClass);         
            DOMhelp.addEvent(triggerLink,'click',sn.changeSection,false); 
            triggerLink.οnclick=DOMhelp.safariClickFix; 
            if(nested[i].parentNode.getElementsByTagName('strong').length>0){ 
                DOMhelp.cssjs('add',triggerLink.parentNode,sn.openClass);         
                DOMhelp.cssjs('add',nested[i],sn.showClass); 
            } 
        } 
    }, 
    changeSection:function(e){ 
        var t=DOMhelp.getTarget(e); 
        var firstList=t.parentNode.getElementsByTagName('ul')[0]; 
        if(DOMhelp.cssjs('check',firstList,sn.showClass)){ 
            DOMhelp.cssjs('remove',firstList,sn.showClass) 
            DOMhelp.cssjs('swap',t.parentNode,sn.openClass,sn.parentClass); 
        } else { 
            DOMhelp.cssjs('add',firstList,sn.showClass) 
            DOMhelp.cssjs('swap',t.parentNode,sn.openClass,sn.parentClass); 
        } 
        DOMhelp.cancelClick(e); 
    } 
} 
DOMhelp.addEvent(window,'load',sn.init,false); 
--> 
</script> 
<h2>js实现无限级树形导航列表</h2>
<ul id="nav"> 
    <li><a href="#">主页</a></li> 
    <li><a href="#">产品</a> 
        <ul> 
            <li><a href="#">大类别一</a> 
                <ul> 
                    <li><a href="#">小类别一</a> 
                        <ul> 
                            <li><a href="#">次类别一</a></li> 
                            <li><a href="#">次类别二</a></li> 
                        </ul> 
                    </li> 
                    <li><a href="#">小类别二</a></li> 
                </ul> 
            </li> 
            <li><a href="#">大类别二</a></li> 
            <li><a href="#">大类别三</a> 
                <ul> 
                    <li><a href="#">小类别一</a></li> 
                    <li><a href="#">小类别二</a></li> 
                </ul> 
            </li> 
        </ul> 
    </li> 
    <li><a href="#">服务</a> 
        <ul> 
            <li><a href="#">大类别一</a></li> 
            <li><a href="#">大类别二</a></li> 
            <li><a href="#">大类别三</a></li> 
        </ul> 
    </li> 
    <li><a href="#">合作</a></li> 
    <li><a href="#">关于我们</a> 
        <ul> 
            <li><a href="#">大类别一</a> 
                <ul> 
                    <li><a href="#">小类别一</a></li> 
                    <li><a href="#">小类别二</a></li> 
                </ul> 
            </li> 
            <li><a href="#">大类别二</a> 
                <ul> 
                    <li><a href="#">小类别一</a></li> 
                    <li><a href="#">小类别二</a></li> 
                </ul> 
            </li> 
            <li><a href="#">大类别三</a> 
                <ul> 
                    <li><a href="#">小类别一</a></li> 
                    <li><a href="#">小类别二</a></li> 
                </ul> 
            </li> 
            <li><a href="#">大类别四</a></li> 
        </ul> 
    </li> 
    <li><a href="#">联系我们</a> 
        <ul> 
            <li><a href="#">大类别一</a></li> 
            <li><a href="#">大类别二</a></li> 
        </ul> 
    </li> 
</ul>
</body>
</html>
<br>
<p><a href="http://www.webdm.cn">网页代码站</a> - 最专业的代码下载网站 - 致力为中国站长提供有质量的代码!</p>

代码来自:http://www.webdm.cn/webcode/48291327-5795-4e03-a07f-8e167900afcf.html

转载于:https://www.cnblogs.com/webdm/archive/2011/05/31/2064152.html

相关文章:

  • Android中文合集 最终版
  • AutoVBA利用Hacth对象填充图元对象
  • fedora15 一些简单应用
  • jQuery自动识别浏览器语言代码以及浏览器中打印信息
  • 嵌入式Linux操作系统学习规划
  • 对大学生有用的一些话
  • Oracle的NULL和NVL
  • cron 介绍
  • 在Oracle怎样查询表中的top10条记录
  • C#抓取网页数据、分析并且去除HTML标签
  • 漫游用户配置文件的实现方法
  • Dreamweaver入门基础与HTML视频教程
  • Java深度历险(八)——Java I/O
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • c#做外挂
  • Cookie 在前端中的实践
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES2017异步函数现已正式可用
  • js继承的实现方法
  • leetcode讲解--894. All Possible Full Binary Trees
  • Mybatis初体验
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • oschina
  • Python学习之路16-使用API
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vuex 学习笔记 01
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里云应用高可用服务公测发布
  • 电商搜索引擎的架构设计和性能优化
  • 码农张的Bug人生 - 初来乍到
  • 王永庆:技术创新改变教育未来
  • 微信开放平台全网发布【失败】的几点排查方法
  • 中文输入法与React文本输入框的问题与解决方案
  • $.ajax()
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (09)Hive——CTE 公共表达式
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (70min)字节暑假实习二面(已挂)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转) Android中ViewStub组件使用
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .apk文件,IIS不支持下载解决
  • .gitignore
  • .NET Core跨平台微服务学习资源
  • .Net Redis的秒杀Dome和异步执行
  • .net web项目 调用webService
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Builder用法
  • @SentinelResource详解
  • [Android]使用Android打包Unity工程