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.onclick=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/p/2064152.html