菜单高亮,几乎是所有Web网站都需要的一个功能。
这个功能,说起来,简单得很,给当前页面的菜单增加一个高亮样式,删除其它菜单的高亮样式。
如果只高亮1个页面的菜单, 太简单了,但是如果菜单和页面比较多,就产生了争议。
第1种方式:每个页面单独高亮。
这个功能,说起来,简单得很,给当前页面的菜单增加一个高亮样式,删除其它菜单的高亮样式。
如果只高亮1个页面的菜单, 太简单了,但是如果菜单和页面比较多,就产生了争议。
第1种方式:每个页面单独高亮。
<li id="indexli"><a href="${base}/">首页</a></li>
<script type="text/javascript">
function highlightIndex() {
highlight("indexli");
}
function highlight(id) {
$("#" + id).addClass("liactive");
}
</script>
好处:灵活性非常强。
坏处:每个页面都需要增加一个高亮菜单的方法。
第2种方式:通过匹配URL, 只写一个高亮菜单的方法。
var url = window.location.pathname;
//默认为‘首页’index
var current = 'index';
if (url.indexOf('/service') != -1) {
current = 'service';
} else if (url.indexOf('/case') != -1) {
current = 'case';
} else if (url.indexOf('/article') != -1) {
current = 'article';
} else if (url.indexOf('/code') != -1) {
current = 'code';
} else if (url.indexOf('/about') != -1) {
current = 'more';
} else if (url.indexOf('/news') != -1) {
current = 'more';
} else if (url.indexOf('/help') != -1) {
current = 'more';
} else if (url.indexOf('/ask') != -1) {
current = 'ask';
} else {
current = 'index';
}
for (var i = 0; i < navList.length; i++) {
if (i == map[current]) {
navList[i].className = 'liactive';
} else {
navList[i].className = '';
}
}
好处:菜单高亮逻辑处理,都在一个地方。
坏处:灵活性很差,对URL有比较严格的要求。
简单说就是,URL的规则越简单越统一,匹配越简单。但是URL如果有例外的情况,就必须做特别处理。
当再增加一个URL的时候,需要考虑新增的URL和已有的URL匹配规则是否产生冲突。
-----------------------------------------------------------
上述2种方法我都用过,说说我的感受。
如果URL比较随意,就在每个具体的页面单独调用高亮函数。
如果URL非常统一,可以统一处理。
在实际过程中,比如公司的项目中,关于采用哪种方式就产生了争议,前端希望统一处理,后端倾向于单独定制。
后端开发过程中,url比较随意。前端希望后端把url规范命名,按照菜单的组织来定义url。
而boss则不愿意这么做,他认为菜单和后端url并不需要严格统一,菜单和后端业务不应该有过强的依赖。
就我们公司的项目和我自己的项目,我更倾向于每个页面单独调用高亮函数,非常灵活。
有的页面,只需要高亮最顶层菜单,有的页面,还需要高亮左侧的菜单。
至于高亮菜单的逻辑,可以封装成方法。
无论你增加了多少页面,每个页面的高亮,都不会互相影响。
-----------------------------------------------------------
再吐槽几句,封装菜单逻辑,每个页面调用一次高亮函数,分分钟就搞定的事情。非要去写统一的URL匹配,花费个把小时,还不能保证完全正确,并且, URL匹配也不能在多个项目之间复用。
团队开发就经常存在这么类似的很多问题, 导致开发效率非常低。
so,我认为,一个优秀的全栈式开发工程师,和5个人的小团队开发效率差不多。