js实现无限级树形导航列表效果代码

本文实例讲述了js实现无限级树形导航列表效果代码。分享给大家供大家参考。具体如下:

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

运行效果截图如下:

在线演示地址如下:

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实现无限级树形导航列表</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>

希望本文所述对大家的JavaScript程序设计有所帮助。

(0)

相关推荐

  • Android多级树形列表控件

    我们开发app过程中,经常会碰到需要 多级列表展示的效果.而Android原生sdk中根本没有3级 4级甚至更多级别的列表控件. 所以我们就要自己去实现一个类似treeListView 的控件,下面这个是我项目中的一个效果图,可支持多级列表扩展. android中有ExpandListView控件,但是这个控件只支持两级列表.对于多级列表如果重写这个不是很好用. 实现这种列表 思想就是递归,构造一个子父级的关系. 话不多说 代码中体会 Activity package com.example.c

  • tree 以树形格式罗列文件

    当你向别人展示你自己所做光盘的内容的时候,或者是罗列你硬盘上某个目录下的资料的时候,tree命令显得相当方便,并且能让你展示的内容层次分明,井井有条.啥也不说了,上图,顺便温习一下cd命令. 当然,你可能并不满足于只给别人抓张图,你可能还想把这些信息导入到文件中去,加工一番再发出去,那么,请使用这条命令:tree>list.txt,这样,所有的信息都保存到list.txt文件中去了. 更多的命令,请在cmd窗口中用 tree /? 查询(其实就两个参数). 很可能只是一条简单的命令,只是一眨眼的

  • php从数据库查询结果生成树形列表的方法

    本文实例讲述了php从数据库查询结果生成树形列表的方法.分享给大家供大家参考.具体分析如下: 本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表 <?php /* Here are the database definitions (for Solid) that i use in this code. * It should not be hard to adapt it to another database. */ /* CREATE TABLE dirent_t

  • Bootstrap树形控件使用方法详解

    一.JQuery树形控件 Jquery树形控件是一款基于JQuery+bootstrap.完全通过js和样式手写出来的非常轻量级的控件,网上很多地方都能看到它的影子.它功能简单.用户体验不错.对于一些简单的层级关系展示比较实用,但对于节点的增删改实现起来就不容易了,如果非要做,可能需要自己去封装. 1.一睹初容 全部收起 展开一级 全部展开 2.代码示例 此控件实现起来也非常简单,只需要引用jQuery和bootstrap组件即可. <link href="~/Content/Tree1/

  • php简单实现无限分类树形列表的方法

    本文实例讲述了php简单实现无限分类树形列表的方法.分享给大家供大家参考.具体如下: $items = array( 1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'), 2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'), 3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'), 4 =

  • javascript下拉列表中显示树形菜单的实现方法

    很简单的一个使用:点击菜单,能够显示下面的或者不显示. 1.主要目的:展现的是的一个菜单项,然后点击一下,隐藏,点一下,弹出下面的内容 用到的是 overflow:hidden    和  overflow="visible"这两个属性 在点击的function中,设置属性应该 node.style.overflow="visible";当然设置tr的高度也是很重要的,要恰好让其他的选项隐蔽 2.采用同样的技术,多加几个,但是就是传参数比较麻烦,采用this传参很常

  • javascript实现在下拉列表中显示多级树形菜单的方法

    本文实例讲述了javascript实现在下拉列表中显示多级树形菜单的方法.分享给大家供大家参考.具体如下: 这里演示在下拉列表框中显示分级的菜单,在很多网站都可以看到的效果,很实用,下拉列表框中的选项是利用JS控制输出,如果你有更好的办法不用JS来显示,那最好了,因为像这种菜单用JS来实现,多多少少有点麻烦. 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

  • cmd tree命令 以树形格式罗列文件

    当你向别人展示你自己所做光盘的内容的时候,或者是罗列你硬盘上某个目录下的资料的时候,tree命令显得相当方便,并且能让你展示的内容层次分明,井井有条.啥也不说了,上图,顺便温习一下cd命令. 当然,你可能并不满足于只给别人抓张图,你可能还想把这些信息导入到文件中去,加工一番再发出去,那么,请使用这条命令:tree>list.txt,这样,所有的信息都保存到list.txt文件中去了. 更多的命令,请在cmd窗口中用 tree /? 查询(其实就两个参数). 很可能只是一条简单的命令,只是一眨眼的

  • 一个简单的js树形菜单

    我练习一下,以免不时之需. 树形菜单不过就是把普通菜单重新排列一下,看起来像树形而已. 上图京东的菜单,给他多几个嵌套,然后添加收缩伸展事件,差不多就行了. 给个例子: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html>

  • QQ好友列表树形列表java代码实现代码

    以前在网上瞎转悠的时候就发现很多人为用Java实现QQ登陆后的面板的问题感到十分头疼,最近我因在写模拟QQ的项目,故不可或缺的遇到了这一个问题,在网上我google了,百度了,最终发现的是有很多人被这一问题困扰,却没有解决的方案,估计是那些写出来了的人,没有发布到网上来,如今,经过自己的多方面查找资料,终于把他写出来了,也不枉昨晚熬夜了,呵呵,好了先让我们来看看实现的效果截图: 好了,效果就是这样了,虽然实现了基本功能,但是还是不完美,比如说好友面板不能随着窗口改变大小而改变,不过应该已经可以解

随机推荐