由一段代码谈前端js优化和编码规范

这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能。当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改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();
        }
    });
时间: 2024-07-28 22:41:57

由一段代码谈前端js优化和编码规范的相关文章

浅谈前端性能优化(移动端)

上一篇讲了PC端的部分:前端性能优化(PC端),这次继续说移动端的.相对于PC端的,移动web浏览器上有一些明显的特点:设备的屏幕小.新特性兼容性较好.支持一些比较新的HTML5和CSS3.需要与Native应用交互等.但移动端可用的CPU资源和网络资源极为有限,因此要做好移动端web上的优化往往需要考虑做更多的事情.首先在移动web的前端页面渲染中,PC的优化规则同样适用,此外针对浏览器也要做一些更细节的优化达到更好的效果.需要注意的是,并不是移动端的优化在PC端不适用,而是由于兼容性的原因,

Vue 浅谈前端js框架vue

Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄 的问世了,它的优雅,轻便也吸引了一部分用户,开始收到关注,16年中旬,VUE2.0问世,这个时候vue不管从性能上,还是从成本上都隐隐超过了react,火的一塌糊涂,这个时候,angular 开发团队也开发了angular2.0版本,并且更名为angular,吸收了react.vue的

前端js优化方案(连续更新)

最近在读<高性能javascript>,在这里记录一下读后的一些感受,顺便加上自己的一些理解,如果有兴趣的话可以关注的我的博客http://www.bloggeng.com/,我会不定期发布一些前端教程还有前端干货,话不多说,进入我们的正题 一.js优化之加载 1.script标签放在底部,不要放在head标签: 2.尽量减少js文件数量 3.给script标签添加一个defer属性,defer属性指明所含的脚本不会修改DOM,因此代码能安全地延迟执行. <script type=&qu

从一段代码谈GetPrivateProfileString的深坑

**总结:GetPrivateProfileString注意文件是否存在, 文件不存在或不具有r读权限会在运行时报内存错误.** 失败源代码如下: string programDir = GetOcxPath(file);//得到ini配置文件路径 ret = GetPrivateProfileString(app,key,"",returnString,MAX_PATH,"c:\\base64bmp_config.ini"); 这段代码看起来没任何问题,在MFC

前端(HTML/CSS/JS)-HTML编码规范

一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签要写alt属性,如果没有就写一个空的.但是一般要写一个有内容的,根据图片想要表达的意思,因为alt是在图片无法加载时显示的文字 如下不太好的写法: <img src="company-logo.svg" alt="ABC Company Logo"> 更好的写法: <img src="chime-logo.svg" alt="ABC Com

前端(HTML/CSS/JS)-JavaScript编码规范

1. 变量命名 (1)变量名不应以短巧为荣 左边的变量名都不太清楚,代码的扩展性不好,一旦代码需要加功能的话,就容易出现obj1.obj2.obj3这种很抽象的命名方式.所以一开始就要把变量的名字起得真实有意义,不要搞一些很短很通用的名字. (2)bool变量 建议布尔变量不用以is/do之类的开头 var isMobile = true, isError = true, doUpdate = false; 可改成: var mobile = true, error = true, update

前端(HTML/CSS/JS)-CSS编码规范

1. 文件名规范 文件名建议用小写字母加中横线的方式.为什么呢?因为这样可读性比较强,看起来比较清爽 https://stackoverflow.com/questions/25704650/disable-blue-highlight-when-touch-press-object-with-cursorpointer 那为什么变量名不用小写字母加小划线的方式 family_tree 因为下划线比较难敲(shift + -),所以一般用驼峰式命名变量的居多. 引入CSS文件的link可以不用带

再谈 JS中的模块规范(CommonJS,AMD,CMD)来自玉伯的seajs分析

随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做项目时,常常会将一些通用的.底层的功能抽象出来,独立成一个个函数,比如 function each(arr) { // 实现代码 } function log(str) { // 实现代码 } 并像模像样地把这些函数统一放在 util.js 里.需要用到时,引入该文件就行.这一切工作得很好,同事也很

编码规范之编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范

不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的. 因此,编写灵活.稳定.高质量的 HTML 和 CSS 代码,是每一个技术人员的基本操守. HTML ************************************************************************ 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双引号,绝不要使用单