由一段代码谈前端js优化和编码规范(一) 分类: JavaScript 2015-03-21 12:43 668人阅读 评论(1) 收藏
这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能。当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改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属性来控制事件触发之后是否折叠。
这段代码主要问题:
- 在函数内部使用$li_elem,wolfArray这样的全局变量,其实这完全是没有必要的;
- 在判断是否含有style标签的时候,我仍然适用的是$li_elem对象,其实我这里只要把wolfArray转化为jq对象就可以了;
- 还是通过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) 收藏的更多相关文章
- 【从0到1学Web前端】CSS定位问题三(相对定位,绝对定位) 分类: HTML+CSS 2015-05-29 23:01 842人阅读 评论(0) 收藏
引子: 开始的时候我想先要解决一个问题,怎么设置一个div盒子撑满整个屏幕? 看下面的html代码: <body> <div id="father-body"&g ...
- 【从0到1学Web前端】CSS定位问题一(盒模型,浮动,BFC) 分类: HTML+CSS 2015-05-27 22:24 813人阅读 评论(1) 收藏
引子: 在谈到css定位问题的时候先来看一个小问题: 已知宽度(假如:100px)div框,水平居中,左右两百年的分别使用div框填充.且左右div自适应. 效果如下图: 这个问题的难点主要是浏览器宽 ...
- 【从0到1学Web前端】CSS伪类和伪元素 分类: HTML+CSS 2015-06-02 22:29 1065人阅读 评论(0) 收藏
1.CSS中的伪类 CSS 伪类用于向某些选择器添加特殊的效果. 语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用 select ...
- 浅谈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 ...
- iOS纯代码手动适配 分类: ios技术 2015-05-04 17:14 239人阅读 评论(0) 收藏
首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...
- 将HTML格式的String转化为HTMLElement 分类: C1_HTML/JS/JQUERY 2014-08-05 12:01 1217人阅读 评论(0) 收藏
代码如下: <meta charset="UTF-8"> <title>Insert title here</title> </head& ...
- 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...
- 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏
1.HTML部分: <form id="form1" runat="server"> <script src=".. ...
- 浅谈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. 后话 以前和安 ...
随机推荐
- jQuery链式调用
<script> var arr = function(){ return new arr.prototype.init(); } arr.prototype.init = functio ...
- python文件操作,读取,修改,合并
# -*- coding:utf-8 -*- ''' 从11c开始提取 ''' import re import numpy as np import os year = '17A' ss=" ...
- Android 3D游戏开发
OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...
- 反编译 轻松调频 Android APP 下载“飞鱼秀”录音
经常听“飞鱼秀”,但是由于时间的原因,只能听回放,但是轻松调频的APP做的有点儿... 听回放的时候经常会中断,还不能拖动进度条,就决定把录音下载下来听. 1.反编译apk(Android反编译过程见 ...
- CGA填充算法之种子填充算法
CGA填充算法之种子填充算法 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜 ...
- Android之ubuntu源码开发环境搭建笔记
昨天,把电脑主机全换了,因此之前的工作环境得重新搭建,我是既开心又纠结,开心的是可以用高配置的电脑,纠结的是搭环境比较麻烦,稍有不慎,就会导致源代码编译不过,前功尽弃.为了减少工作量,以及避免不必要掉 ...
- [leetcode] 21. Implement strStr()
这个题目是典型的KMP算法,当然也可以试试BM,当然有关KMP和BM的介绍阮一峰曾经写过比较好的科普,然后july也有讲解,不过那个太长了. 先放题目吧: Implement strStr(). Re ...
- Python学习-36.Python中的字典解释
具体同列表解释,也是使用if来进行过滤 例子,生成一个新的字典,并且是原来字典的键值交换. mydict={'Tom':18,'Mary':20} print({value:key for key,v ...
- LeetCode151:Reverse Words in a String
题目: Given an input string, reverse the string word by word. For example, Given s = "the sk ...
- Unity/C#基础复习(3) 之 String与StringBuilder的关系
参考资料 [1] @毛星云[<Effective C#>提炼总结] https://zhuanlan.zhihu.com/p/24553860 [2] <C# 捷径教程> [3 ...