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 相关文章推荐
Grid得到选择行数据的方法总结
Jan 17 Javascript
form表单action提交的js部分与html部分
Jan 07 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
详解Vue Elememt-UI构建管理后台
Feb 27 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
详解写好JS条件语句的5条守则
Feb 28 Javascript
微信小程序调用后台service教程详解
Nov 06 Javascript
javascript实现时钟动画
Dec 03 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 header Content-Type类型小结
2011/07/03 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
php设计模式之委托模式
2016/02/13 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
js 数组操作代码集锦
2009/04/28 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
2014年党支部学习材料
2014/05/19 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
自我查摆剖析材料
2014/10/11 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
三八节活动主持词
2015/07/04 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫