JS实现多级菜单中当前菜单不随页面跳转样式而发生变化


Posted in Javascript onMay 30, 2017

一.概述

        本文介绍了JQuery巧妙实现多级菜单中当前菜单不随页面跳转样式发生变化,貌似没看懂啥意思?

看图说话:就是点二级或多级菜单时,父级展开,当前菜单是被选中状态,这下明白了吧?

JS实现多级菜单中当前菜单不随页面跳转样式而发生变化

二.应用场景

         当一个项目使用公共模板文件时(如上图的左侧菜单栏),我们给每个子菜单添加链接时,点击页面跳转样后还是公共模板的样式,这时就需要实现动态加载当前菜单的样式。

三.实现方法

第一种:.通过php传递变量,模板页面通过接收这些变量来实现当前页面的菜单选中与否,父级展开等这些样式

缺点:虽然实现简单,但是每个页面都需要php传递变量,很繁琐,这种方法不推荐,故不再赘述!

第二种:通过比对当前菜单里的a标签的href值与浏览器的url的值,判断a标签里href属性值是属于浏览器url中的一部分,即表示包含该a标签的菜单应该时被选中状态,在将样式赋予该菜单及对应的父级菜单。

四.举个栗子

<ul class="sidebar-menu">
  <li class="header">主菜单</li>
  <li class="treeview">
   <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
   <i class="fa fa-users"></i> <span>用户管理</span>
   <span class="pull-right-container">
    <i class="fa fa-angle-left pull-right"></i>
   </span>
   </a>
   <ul class="treeview-menu">
   <li><a href="{{ path('agent') }}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 代理商</a></li>
   <li><a href="{{ path('client') }}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 委托人</a></li>
   <li><a href="{{ path('cs_staff') }}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 客服</a></li>
   <li><a href="{{ path('admin') }}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 管理员</a></li>
   </ul>
  </li>
  <li class="treeview">
   <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
   <i class="fa fa-bicycle"></i> <span>车辆管理</span>
   <span class="pull-right-container">
    <i class="fa fa-angle-left pull-right"></i>
   </span>
   </a>
   <ul class="treeview-menu">
   <li><a href="{{ path('bike') }}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 单车</a></li>
   </ul>
  </li>
  <li class="treeview">
   <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
   <i class="fa fa-fw fa-cny"></i> <span>统计报表</span>
   <span class="pull-right-container">
    <i class="fa fa-angle-left pull-right"></i>
   </span>
   </a>
   <ul class="treeview-menu">
   <li><a href="{{ path('report')}}" rel="external nofollow" ><i class="fa fa-circle-o"></i> 单车收益</a></li>
   </ul>
  </li>
  </ul>

注:上述样式是bootstamp的样式

如果当前页面是管理员页,那个给所对应的li添加class="active"的属性,父级ul的样式由style="display: none;"修改为style="display: block;",ul的父级再添加class="active"的属性,即有了图一的效果。

以下是我写的js实现代码,放在公共js文件即可

var CURRENT_URL = window.location.href.split('?')[0];
 CURRENT_URL_ARR=CURRENT_URL.split("/",6); 
 for (i=0;i<CURRENT_URL_ARR.length ;i++ ){
 TEM_URL = CURRENT_URL_ARR.join(",");
 TEM_URL = TEM_URL.replace(/,/g,"/");
 $('.sidebar-menu').find('a').filter(function () {
  return this.href ==TEM_URL+"/";
 }).parent('li').addClass('active').parent('ul').css("display","block").parent('li').addClass('active');
 CURRENT_URL_ARR.pop();
 }

解释:

第1行:取得当前url?前的地址,去除url参数

alert(CURRENT_URL);

结果为:http://partner.bike.lc/admin/

第2行:把url里按“/”再次分割成字符串数组,后面的6为了精确的找到对应控制器及方法,按需设着

alert(CURRENT_URL_ARR);

结果为:http:,,partner.bike.lc,admin,

第3行:循环匹配url

第4行:再将数组转化为字符串

aert(TEM_URL);

循环得到的结果依次为:

http:,,partner.bike.lc,admin,
http:,,partner.bike.lc,admin
http:,,partner.bike.lc
...

第5行:将上一步字符串转化为URL形式

aert(TEM_URL);

循环得到的结果依次为:

http://partner.bike.lc/admin/
http://partner.bike.lc/admin
http://partner.bike.lc

...

第6-10行:遍历菜单栏里的所有a标签,判断循环里的url是否有等于a标签的href值,如果有加上所需的样式

 注:

this.href得到的是完整的URL地址;

pop用于删除并返回数组的最后一个元素,此步很重要。

好了,以上所述是小编给大家介绍的JS实现多级菜单中当前菜单不随页面跳转样式而发生变化 。不知道大家理解了没有。主要是理解实现思路,样式可根据自身情况调整~

Javascript 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
js随机颜色代码的多种实现方式
Apr 23 Javascript
jquery自定义表格样式
Nov 23 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
javascript实现瀑布流动态加载图片原理
Aug 12 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
Jan 04 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
微信小程序 本地数据存储实例详解
Apr 13 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 Javascript
js图片轮播插件的封装
Jul 21 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
JavaScript字符串转数字的简单实现方法
Nov 27 Javascript
Angularjs中使用轮播图指令swiper
May 30 #Javascript
AngularJS路由Ui-router模块用法示例
May 29 #Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 #Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 #Javascript
Angular2使用jQuery的方法教程
May 28 #jQuery
Angular.js实现动态加载组件详解
May 28 #Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 #Javascript
You might like
PHP学习之PHP运算符
2006/10/09 PHP
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
2014/08/19 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
详解PHP PDO简单教程
2019/05/28 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
详解Python中的__new__()方法的使用
2015/04/09 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
高级运动鞋:GREATS
2019/07/19 全球购物
实习教师自我鉴定
2013/09/27 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
交通安全月活动总结
2015/05/08 职场文书
公司规章制度范本
2015/08/03 职场文书
师德培训心得体会2016
2016/01/09 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang