js實(shí)現(xiàn)無(wú)限級(jí)樹(shù)形導(dǎo)航列表效果代碼
本文實(shí)例講述了js實(shí)現(xiàn)無(wú)限級(jí)樹(shù)形導(dǎo)航列表效果代碼。分享給大家供大家參考。具體如下:
這是一款js實(shí)現(xiàn)無(wú)限級(jí)樹(shù)形下拉導(dǎo)航菜單,簡(jiǎn)潔實(shí)用,用到一個(gè)已封裝好的JS類(lèi),有用的大家借鑒一下。
運(yùn)行效果截圖如下:

在線(xiàn)演示地址如下:
http://demo.jb51.net/js/2015/js-unlimit-tree-style-nav-list-codes/
具體代碼如下:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<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(images/user_23.gif) 5px 10px no-repeat;}
#nav.dyn li.open{ background:url(images/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實(shí)現(xiàn)無(wú)限級(jí)樹(shù)形導(dǎo)航列表</h2>
<ul id="nav">
<li><a href="#">主頁(yè)</a></li>
<li><a href="#">產(chǎn)品</a>
<ul>
<li><a href="#">大類(lèi)別一</a>
<ul>
<li><a href="#">小類(lèi)別一</a>
<ul>
<li><a href="#">次類(lèi)別一</a></li>
<li><a href="#">次類(lèi)別二</a></li>
</ul>
</li>
<li><a href="#">小類(lèi)別二</a></li>
</ul>
</li>
<li><a href="#">大類(lèi)別二</a></li>
<li><a href="#">大類(lèi)別三</a>
<ul>
<li><a href="#">小類(lèi)別一</a></li>
<li><a href="#">小類(lèi)別二</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">服務(wù)</a>
<ul>
<li><a href="#">大類(lèi)別一</a></li>
<li><a href="#">大類(lèi)別二</a></li>
<li><a href="#">大類(lèi)別三</a></li>
</ul>
</li>
<li><a href="#">合作</a></li>
<li><a href="#">關(guān)于我們</a>
<ul>
<li><a href="#">大類(lèi)別一</a>
<ul>
<li><a href="#">小類(lèi)別一</a></li>
<li><a href="#">小類(lèi)別二</a></li>
</ul>
</li>
<li><a href="#">大類(lèi)別二</a>
<ul>
<li><a href="#">小類(lèi)別一</a></li>
<li><a href="#">小類(lèi)別二</a></li>
</ul>
</li>
<li><a href="#">大類(lèi)別三</a>
<ul>
<li><a href="#">小類(lèi)別一</a></li>
<li><a href="#">小類(lèi)別二</a></li>
</ul>
</li>
<li><a href="#">大類(lèi)別四</a></li>
</ul>
</li>
<li><a href="#">聯(lián)系我們</a>
<ul>
<li><a href="#">大類(lèi)別一</a></li>
<li><a href="#">大類(lèi)別二</a></li>
</ul>
</li>
</ul>
希望本文所述對(duì)大家的JavaScript程序設(shè)計(jì)有所幫助。
- JS中用三種方式實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單
- JS實(shí)現(xiàn)選中當(dāng)前菜單后高亮顯示的導(dǎo)航條效果
- 一個(gè)js控制的導(dǎo)航菜單實(shí)例代碼
- CSS3+Js實(shí)現(xiàn)響應(yīng)式導(dǎo)航條
- JS 實(shí)現(xiàn)導(dǎo)航欄懸停效果
- js實(shí)現(xiàn)移動(dòng)端導(dǎo)航點(diǎn)擊自動(dòng)滑動(dòng)效果
- JavaScript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊導(dǎo)航欄變色特效
- js實(shí)現(xiàn)的常用的左側(cè)導(dǎo)航效果
- JavaScript實(shí)現(xiàn)滑動(dòng)導(dǎo)航欄效果
- 原生js實(shí)現(xiàn)波浪導(dǎo)航效果
相關(guān)文章
js實(shí)現(xiàn)點(diǎn)擊選項(xiàng)置頂動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)點(diǎn)擊選項(xiàng)置頂動(dòng)畫(huà)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
側(cè)欄跟隨滾動(dòng)的簡(jiǎn)單實(shí)現(xiàn)代碼
側(cè)欄里的有些內(nèi)容滾動(dòng)到頁(yè)面頂端以后就固定在那個(gè)位置,不再跟隨滾動(dòng)條而滾動(dòng),想必很多站長(zhǎng)朋友都想實(shí)現(xiàn)這個(gè)效果吧,接下來(lái)為大家詳細(xì)介紹下,感興趣的你可不要錯(cuò)過(guò)了哈2013-03-03
實(shí)現(xiàn)非常簡(jiǎn)單的js雙向數(shù)據(jù)綁定
Angular實(shí)現(xiàn)了雙向綁定機(jī)制。所謂的雙向綁定,無(wú)非是從界面的操作能實(shí)時(shí)反映到數(shù)據(jù),數(shù)據(jù)的變更能實(shí)時(shí)展現(xiàn)到界面。本文給大家詳細(xì)介紹js雙向數(shù)據(jù)綁定,感興趣的朋友參考下2015-11-11
JS獲取url參數(shù),JS發(fā)送json格式的POST請(qǐng)求方法
下面小編就為大家分享一篇JS獲取url參數(shù),JS發(fā)送json格式的POST請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
JavaScript實(shí)現(xiàn)讀取條碼中的二進(jìn)制數(shù)據(jù)
條碼是一種以機(jī)器可讀的可視形式表示數(shù)據(jù)的方法,我們可以從條碼獲取二進(jìn)制數(shù)據(jù),并通過(guò)不同方法去讀碼,下面我們就來(lái)看看如何實(shí)現(xiàn)讀取條碼中的二進(jìn)制數(shù)據(jù)吧2024-03-03
關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理
箭頭函數(shù)可以說(shuō)是es6的一大亮點(diǎn),使用箭頭函數(shù),可以簡(jiǎn)化編碼過(guò)程,是代碼更加的簡(jiǎn)潔,下面這篇文章主要給大家介紹了關(guān)于ES6中箭頭函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

