这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能。当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改js代码中写死的索引。。。确实是比较恼火的,后来就修改了一下,能够自动的查找索引了,但是写的代码很不规范,前几天看到这段代码的时候,简直要吐血。。。所以就简单优化了一下

1.情景描述:

html代码大致就是如下所示:

<a><li></li></a>
<li></li>
<li></li>
<li></li>
<li></li>
<a><li></li></a>
<li></li>
<li></li>
<li></li>
<li></li>
<a><li></li></a>
<li></li>
<li></li>
<li></li>
<li></li>
<a><li></li></a>
<li></li>
<li></li>
<li></li>
<li></li>

我要做的工作就是使用js或者说jq让我点击每个a标签的时候,能够折叠当前a标签到下一个a标签之间的li标签元素。

2.代码解析

之前写代码如下:

$('#sina_wolf_state').bind('click', function () {
var $me = $(this);
//获取a标签之后的所有元素
$li_elem = $me.nextAll();
//定义一个数组把两个a标签之间的对象加入到新数组中
wolfArray = []
for (var i=0;i<$li_elem.length;i++) {
var arrayTagName = $li_elem.get(i).tagName;
if (arrayTagName == 'LI') {
wolfArray.push($li_elem);
}
else {
break;
}
}
//判断标签是否含有style属性,这个时候会有一个bug就是判断会作用在所有的li元素上
var display = $li_elem.attr('style');
if (display == 'display: none') {
$li_elem.removeAttrs('style');
}
else {
$li_elem.slice(0, wolfArray.length).slideToggle();
}
});

由上面的代码,可以看出我的意图是想获取当前元素之后的所有同级元素然后通过循环来获取夹在两个a标签之间的li元素,然后通过判断是否含有style属性来控制事件触发之后是否折叠。

这段代码主要问题:

  1. 在函数内部使用$li_elem,wolfArray这样的全局变量,其实这完全是没有必要的;
  2. 在判断是否含有style标签的时候,我仍然适用的是$li_elem对象,其实我这里只要把wolfArray转化为jq对象就可以了;
  3. 还是通过nextAll()一次性的获取了大量的无用对象;

之后我就对这些代码就行了一些优化,优化后的代码如下:

$('#sina_wolf_state').bind('click', function () {
//合并代码减少代码长度,并且声明变量为函数内部的局部变量
var $li_elem = $(this).nextAll();
var wolfArray = [],liEleLength=0;
//在这里不用每次循环都去计算$li_elem的长度
var liEleLength = $li_elem.length;
for (var i=0;i<liEleLength;i++) {
var arrayTagName = $li_elem.get(i).tagName;
if (arrayTagName == 'LI') {
wolfArray.push($li_elem[i]);
}
else {
break;
}
}
//这里使用了获取的wolfArry对象来判断,而不会作用在全部的li元素上
var display = $(wolfArray).attr('style');
if (display == 'display: none') {
$(wolfArray).removeAttrs('style');
}
else {
$(wolfArray).slice(0, wolfArray.length).slideToggle();
}
});

版权声明:本文为博主原创文章,未经博主允许不得转载。

由一段代码谈前端js优化和编码规范(一) 分类: JavaScript 2015-03-21 12:43 668人阅读 评论(1) 收藏的更多相关文章

  1. 【从0到1学Web前端】CSS定位问题三(相对定位,绝对定位) 分类: HTML+CSS 2015-05-29 23:01 842人阅读 评论(0) 收藏

    引子: 开始的时候我想先要解决一个问题,怎么设置一个div盒子撑满整个屏幕? 看下面的html代码: <body> <div id="father-body"&g ...

  2. 【从0到1学Web前端】CSS定位问题一(盒模型,浮动,BFC) 分类: HTML+CSS 2015-05-27 22:24 813人阅读 评论(1) 收藏

    引子: 在谈到css定位问题的时候先来看一个小问题: 已知宽度(假如:100px)div框,水平居中,左右两百年的分别使用div框填充.且左右div自适应. 效果如下图: 这个问题的难点主要是浏览器宽 ...

  3. 【从0到1学Web前端】CSS伪类和伪元素 分类: HTML+CSS 2015-06-02 22:29 1065人阅读 评论(0) 收藏

    1.CSS中的伪类 CSS 伪类用于向某些选择器添加特殊的效果. 语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用 select ...

  4. 浅谈new operator、operator new和placement new 分类: C/C++ 2015-05-05 00:19 41人阅读 评论(0) 收藏

    浅谈new operator.operator new和placement new C++中使用new来产生一个存在于heap(堆)上对象时,实际上是调用了operator new函数和placeme ...

  5. iOS纯代码手动适配 分类: ios技术 2015-05-04 17:14 239人阅读 评论(0) 收藏

    首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...

  6. 将HTML格式的String转化为HTMLElement 分类: C1_HTML/JS/JQUERY 2014-08-05 12:01 1217人阅读 评论(0) 收藏

    代码如下: <meta charset="UTF-8"> <title>Insert title here</title> </head& ...

  7. 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏

    以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...

  8. 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏

    1.HTML部分:     <form id="form1" runat="server">     <script src=".. ...

  9. 浅谈IOS8之size class 分类: ios技术 2015-02-05 19:06 62人阅读 评论(0) 收藏

    文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...

随机推荐

  1. 获取iOS 设备上崩溃日志 (Crash Log)的方法

    1. iTunes同步获取 大部分用户会使用iTunes软件来管理iPhone,这样同步的Crash日志就会同步到电脑上,我们需要在特定的路径里面查找 Mac OS X:~/Library/Logs/ ...

  2. TurtleBot教程

    TurtleBot TurtleBot combines popular off-the-shelf robot components like the iRobot Create, Yujin Ro ...

  3. 菜鸟——使用bootstrap

    方法一: 直接在页面中加入bootstrap的网址,不需要做其他任何改动 <%-- Created by IntelliJ IDEA. User: JC Date: 2017/2/24 Time ...

  4. [LeetCode 题解] Search in Rotated Sorted Array

    前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...

  5. Transaction And Lock--唯一索引下INSERT导致的死锁

    背景: 曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗? 测试: --========== ...

  6. BCP IN示例

    参考:http://www.cnblogs.com/qanholas/archive/2011/07/05/2098616.html bcp {dbtable | query} {in | out | ...

  7. ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

    ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流 ...

  8. 深入理解Aspnet Core之Identity(3)

    主题 账户管理一个比较常见的功能就是密码强度策略,Identity已经内置了一个通用的可配置的策略,我们一般情况下可以直接拿来用即可.本篇我会介绍一些Identity内置的密码策略类:Password ...

  9. 手写数字识别---demo

    数据准备 课程中获取数据的方法是从库中直接load_data from keras.datasets import mnist (x_train, y_train), (x_test, y_test) ...

  10. Delphi - 如何执行Windows、OSX、Linux的外部程序?

    毫无疑问,几乎对所有Delphi程序员来说,不用说如何在Windows下如何执行外部程序了!目前Delphi,真的已经很棒了,Delphi有一套和VCL并驾齐驱的图形界面库,叫做"FireM ...