js导航菜单(自写)简单大方


Posted in Javascript onMarch 28, 2013

最近由于项目需要一个简单的多级下拉菜单菜单但是由于业务和样式上的要求,为了简洁,在网上找了很多导航菜单控件都不大适合,所以突发奇想自己写个吧~该动手就动手啊~
HTML部分

  
<h2> 
SuperFish</h2> 
<ul class="nav" hid="root"> 
<li><a href="javascript:void(0)" testid="aa">一级li 1</a> 
<ul> 
<li><a href="javascript:void(0)" testid="bb">二级 li 1</a></li> 
<li><a href="javascript:void(0)" testid="cc">二级 li 2</a> 
<ul> 
<li><a href="javascript:void(0)" testid="dd">三级 li 1</a></li> 
<li><a href="javascript:void(0)" testid="ee">三级 li 2</a></li> 
<li><a href="javascript:void(0)" testid="ff">三级 li 3</a></li> 
<li><a href="javascript:void(0)" testid="gg">三级 li 4</a></li> 
<li><a href="javascript:void(0)" testid="hh">三级 li 5</a></li> 
<li><a href="javascript:void(0)" testid="ii">三级 li 6</a> 
<ul> 
<li><a href="javascript:void(0)" testid="jj">四级 li 1</a></li> 
<li><a href="javascript:void(0)" testid="kk">四级 li 2</a></li> 
</ul> 
</li> 
</ul> 
</li> 
<li><a href="javascript:void(0)" testid="ll">二级 li 3</a> 
<ul> 
<li><a href="javascript:void(0)" testid="mm">三级 li 6</a></li> 
<li><a href="javascript:void(0)" testid="nn">三级 li 7</a></li> 
<li><a href="javascript:void(0)" testid="oo">三级 li 8</a></li> 
<li><a href="javascript:void(0)" testid="pp">三级 li 9</a></li> 
<li><a href="javascript:void(0)" testid="qq">三级 li 10</a></li> 
</ul> 
</li> 
<li><a href="javascript:void(0)" testid="rr">二级 li 4</a> 
<ul> 
<li><a href="javascript:void(0)" testid="ss">三级 li 11</a></li> 
<li><a href="javascript:void(0)" testid="tt">三级 li 12</a></li> 
<li><a href="javascript:void(0)" testid="uu">三级 li 13</a></li> 
<li><a href="javascript:void(0)" testid="vv">三级 li 14</a></li> 
<li><a href="javascript:void(0)" testid="ww">三级 li 15</a></li> 
</ul> 
</li> 
</ul> 
</li> 
<li><a href="javascript:void(0)" testid="xx">一级li 2</a> 
<ul> 
<li><a href="javascript:void(0)" testid="ss">二级 li 11</a></li> 
</ul> 
</li> 
</ul>

Javascript部分
<script language="javascript" type="text/javascript"> 
var navigationBar = function () { 
//使用时将testid属性换成href属性即可 
var currentUrlHref = "jj"; 
var root = $("ul[hid='root']"); 
$(root).find(">li").attr("first_level", true); 
$(root).find(">li>a").addClass("nav_first_style"); 
//递归向下查找可展开元素并且绑定toggle展开事件 
var searchChildren = function (root) { 
if (root.find(">li").length > 0) { 
$(root).addClass("ul_style"); 
var liChildren = root.find(">li"); 
$(liChildren).each(function (idx, item) { 
searchChildren($(item)); 
}) 
} else if (root.find(">ul").length > 0) { 
$(root).addClass("li_style"); 
if ($(root).attr("first_level") != true.toString()) { 
$(root).find(">a").addClass("li_style_a"); 
} 
var aLink = $(root).find(">a"); 
//初始装载的时候判断当前url是不是和导航栏中的东西匹配 
if (currentUrlHref == $(aLink).attr("testid")) { 
findInitPosition(aLink); 
} 
$(aLink).toggle(function () { 
$(this).addClass("li_style_a_selected"); 
$(this).parent().find(">ul").show("fast"); 
//隐藏非一级节点下的所有兄弟元素 
if ($(this).parent().attr("first_level") != true.toString()) { 
$(this).parent().siblings().find(">a").removeClass("li_style_a_selected"); 
$(this).parent().siblings().each(function (idx, item) { 
removeClassAndHide(item); 
}) 
} else { 
$(this).addClass("nav_first_style_selected"); 
$(this).removeClass("li_style_a_selected"); 
$(this).parent().siblings().find(">a").removeClass("nav_first_style_selected"); 
$(this).parent().siblings().each(function (idx, item) { 
removeClassAndHide(item); 
}) 
} 
}, function () { 
if ($(this).parent().attr("first_level") == true.toString()) { 
$(this).addClass("nav_first_style_selected"); 
$(this).parent().siblings().find(">a").removeClass("nav_first_style_selected"); 
} 
removeClassAndHide($(this).parent()); 
}) 
var ulChildren = root.find(">ul"); 
$(ulChildren).each(function (idx, item) { 
$(item).hide(); 
searchChildren($(item)); 
}); 
} else { 
if ($(root).attr("first_level") != true.toString()) { 
$(root).find(">a").addClass("li_style_a"); 
} 
$(root).addClass("li_style"); 
$(root).click(function () { 
if ($(root).attr("first_level") != true.toString()) { 
$(this).find(">a").addClass("li_style_a_selected"); 
$(this).siblings().find(">a").removeClass("li_style_a_selected"); 
$(this).siblings().each(function (idx, item) { 
removeClassAndHide(item); 
addFirstLevelClass(item); 
}) 
} else { 
$(this).find(">a").addClass("nav_first_style_selected"); 
$(this).find(">a").removeClass("li_style_a_selected"); 
$(this).siblings().find(">a").removeClass("nav_first_style_selected"); 
removeClassAndHide(this); 
} 
}) 
if (currentUrlHref == $(root).find(">a").attr("testid")) { 
findInitPosition($(root).find(">a")); 
} 
} 
} 
//递归查找初始位置 
var findInitPosition = function (aLink) { 
var currentLi = $(aLink).parent(); 
if ($(currentLi).parent().parent().find(">a").length > 0) { 
findInitPosition($(currentLi).parent().parent().find(">a")); 
} 
if ($(currentLi).find(">ul").length > 0) { 
$(currentLi).find(">ul").show("fast"); 
} 
if ($(currentLi).attr("first_level") != true.toString()) { 
$(currentLi).find(">a").addClass("li_style_a_selected"); 
} else { 
$(currentLi).find(">a").addClass("nav_first_style_selected"); 
} 
} 
//递归向下删除所有子节点的选中样式 
var removeClassAndHide = function (li) { 
if ($(li).attr("first_level") != true.toString()) { 
$(li).find(">a").removeClass("li_style_a_selected"); 
$(li).find(">ul").hide("fast"); 
if ($(li).find(">ul").length > 0) { 
$(li).find(">ul>li").each(function (idx, item) { 
removeClassAndHide(item); 
}); 
} 
} else if ($(li).attr("first_level") == true.toString()) { 
$(li).find(">ul").hide("fast"); 
$(li).find(">ul>li").each(function (idx, item) { 
removeClassAndHide(item); 
}) 
} else { 
$(li).find(">ul").show("fast"); 
$(li).find(">ul>li").each(function (idx, item) { 
removeClassAndHide(item); 
}) 
} 
} 
//递归向上添加第一层节点样式 
var addFirstLevelClass = function (li) { 
if ($(li).attr("first_level") != true.toString()) { 
addFirstLevelClass($(li).parent().parent()); 
} else { 
if (!$(li).find(">a").hasClass("nav_first_style_selected")) { 
$(li).find(">a").addClass("nav_first_style_selected"); 
$(li).siblings().find(">a").removeClass("nav_first_style_selected"); 
} 
} 
} 
//创建导航 
var createNav = function () { 
searchChildren(root); 
} 
createNav(); 
} 
var initNav = new navigationBar(); 
</script>

不过暂时还没有封装成类似jquery的写法,其实还可以继续封成一个控件~
js导航菜单(自写)简单大方
Javascript 相关文章推荐
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
js原生appendChild的bug解决心得分享
Jul 01 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
Oct 17 Javascript
jQuery实现简单的间隔向上滚动效果
Mar 09 Javascript
JavaScript Split()方法
Dec 18 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
Vue.js进行查询操作的实例详解
Aug 25 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
Aug 28 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
商城常用滚动的焦点图效果代码简单实用
Mar 28 #Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 #Javascript
jQuery div层的放大与缩小简单实现代码
Mar 28 #Javascript
jQuery+.net实现浏览更多内容(改编php版本)
Mar 28 #Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 #Javascript
自定义jQuery选项卡插件实例
Mar 27 #Javascript
js数组的操作详解
Mar 27 #Javascript
You might like
新版PHP将向Java靠拢
2006/10/09 PHP
将数组写入txt文件 var_export
2009/04/21 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
Linux中为php配置伪静态
2014/12/17 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
Python 数据处理库 pandas进阶教程
2018/04/21 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
合唱兴趣小组活动总结
2014/07/10 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
单位收入证明范本
2015/06/18 职场文书
2015年征兵工作总结
2015/07/23 职场文书
教师节校长致辞
2015/07/31 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
vue实力踩坑之push当前页无效
2022/04/10 Vue.js
如何通过cmd 连接阿里云服务器
2022/04/18 Servers