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 相关文章推荐
javascript知识点收藏
Feb 22 Javascript
Javascript之文件操作
Mar 07 Javascript
javascript IE中的DOM ready应用技巧
Jul 23 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
javascript设计模式--策略模式之输入验证
Nov 27 Javascript
快速使用Bootstrap搭建传送带
May 06 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
Ext JS 实现建议词模糊动态搜索功能
May 13 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 Javascript
关于单文件组件.vue的使用
Sep 20 Javascript
Vue数据双向绑定底层实现原理
Nov 22 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类
2006/11/27 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
动态加载js的几种方法
2006/10/23 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
js实现黑白div块画空心的图形
2018/12/13 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python、Matlab求定积分的实现
2019/11/20 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
外包公司软件测试工程师
2014/11/01 面试题
集中整治工作方案
2014/05/01 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python