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 相关文章推荐
javascript循环变量注册dom事件 之强大的闭包
Sep 08 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
Dec 15 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
JavaScript之Vue.js【入门基础】
Dec 06 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 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 shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
PHP的基本常识小结
2013/07/05 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
Angular工具方法学习
2016/12/26 Javascript
js 颜色选择插件
2017/01/23 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
python继承和抽象类的实现方法
2015/01/14 Python
python关键字and和or用法实例
2015/05/28 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
YUV转为jpg图像的实现
2019/12/09 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
物流专业大学应届生求职信
2013/11/03 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
大学生入党思想汇报
2014/01/01 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
难忘的一课教学反思
2014/04/30 职场文书
停课通知书
2015/04/24 职场文书
高三化学教学反思
2016/02/22 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android