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 相关文章推荐
jquery.cvtooltip.js 基于jquery的气泡提示插件
Nov 19 Javascript
JS访问SWF的函数用法实例
Jul 01 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
Jul 28 Javascript
js实现按钮控制带有停顿效果的图片滚动
Aug 30 Javascript
深入理解js中的加载事件
Feb 08 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
微信小程序实现之手势锁功能实例代码
Jul 19 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
Apr 10 Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 13 Javascript
TS 类型收窄教程示例详解
Sep 23 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正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
python单例模式实例分析
2015/04/08 Python
python文件写入实例分析
2015/04/08 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python实现代码块儿折叠
2020/04/15 Python
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
2014年安全生产责任书
2014/07/22 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android