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


Posted in Javascript onSeptember 23, 2015

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

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

运行效果截图如下:

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

在线演示地址如下:

具体代码如下:

<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程序设计有所帮助。

Javascript 相关文章推荐
json2.js的初步学习与了解
Oct 06 Javascript
node.js中的favicon.ico请求问题处理
Dec 15 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
Bootstrap Search Suggest使用例子
Dec 21 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 Javascript
bootstrap table表格插件使用详解
May 08 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
Nov 11 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
详解如何用VUE写一个多用模态框组件模版
Sep 27 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
JavaScript如何获取一个元素的样式信息
Jul 29 Javascript
react中Suspense的使用详解
Sep 01 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 #Javascript
JS实现3D图片旋转展示效果代码
Sep 22 #Javascript
JS+CSS实现带小三角指引的滑动门效果
Sep 22 #Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
Sep 22 #Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 #Javascript
jQuery实现的经典滑动门效果
Sep 22 #Javascript
jquery实现的简单二级菜单效果代码
Sep 22 #Javascript
You might like
Zend的Registry机制的使用说明
2013/05/02 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
jQuery操作select的实例代码
2012/06/14 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
vue组件间通信解析
2017/03/01 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python求众数问题实例
2014/09/26 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
汉语言文学职业规划
2014/02/14 职场文书
销售工作决心书
2015/02/04 职场文书
《打电话》教学反思
2016/02/22 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
利用Python多线程实现图片下载器
2022/03/25 Python
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL