如何书写高质量jQuery代码(使用jquery性能问题) |
本文标签:高质量,jQuery 1.正确引用jQuery <body> <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script> <script>window.jQuery || document.write(<script src="jquery1.8.min.js">\x3C/script>)</script> </body> 2.优化jQuery选择器 高效正确的使用jQuery选择器是熟练使用jQuery的基础,而掌握jQuery选择器需要一定的时间积累,我们开始学习jQuery时就应该注意选择器的使用 。 <div id="nav" class="nav"> <a class="home" href="http://www.jb51.net">脚本之家</a> <a class="articles" href="http://www.jb51.net/list/list_172_1.htm">jQuery教程</a> </div> 如果我们选择class为home的a元素时,可以使用下边代码: $(.home); //1 $(#nav a.home); //2 $(#nav).find(a.home); //3 1.方法1会使jQuery在整个DOM中查找class为home的a元素,性能可想而知 。 关于jQuery选择器的性能优先级,ID选择器快于元素选择器,元素选择器快于class选择器 。因为ID选择器和元素选择器是原生的JavaScript操作,而类选择器不是,大家顺便可以看下find context 区别,find() children区别 。 3.缓存jQuery对象 缓存jQuery对象可以减少不必要的DOM查找,关于这点大家可以参考下缓存jQuery对象来提高性能 。 4.正确使用事件委托 <table id="t"> <tr> <td>我是单元格</td> </tr> </table> 比如我们要在上边的单元格上绑定一个单击事件,不注意的朋友可能随手写成下边的样子: $(#t).find(td).on(click, function () { $(this).css({ color: red, background: yellow }); }); 这样会为每个td绑上事件,在为100个单元格绑定click事件的测试中,两者性能相差7倍之多,好的做法应该是下边写法: $(#t).on(click, td, function () { $(this).css({ color: red, background: yellow }); }); 5.精简jQuery代码 $(#t).on(click, td, function () { $(this).css(color, red).css(background, yellow); }); 6.减少DOM操作 var $t = $(body); $t.append(<table>); $t.append(<tr><td>1</td></tr>); $t.append(</table>); 好的做法: $(body).append(<table><tr><td>1</td></tr></table>); 这样在拼接完table串后再添加到body中,对DOM的操作只需一次 。群里以前有朋友就因为这个导致在IE下输出时出现问题,而关于字符串的拼接可以参考下最快创建字符串的方法 。 7.不使用jQuery 原生函数总是最快的,这点不难理解,在代码书写中我们不应该忘记原生JS 。 就先总结这几条吧,每条建议并不难理解,但总结全面的话还是要花费不少时间的 。如在减少代码段中,如果需要根据条件从数组中得到新数组时,可以使用$.grep() 方法,如果你在使用jQuery时有自己必得的话,欢迎在留言中和大家分享! 下面是其它网友的补充: 注意定义jQuery变量的时候添加var关键字 $loading = $(#loading); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的 请使用一个var来定义变量 复制代码 代码如下: var page = 0, $loading = $(#loading), $body = $(body); 不要给每一个变量都添加一个var关键字,除非你有严重的强迫症 var$loading = $(#loading); 这里定义成这样的好处在于,你可以有效的提示自己或者其它阅读你代码的用户,这是一个jQuery的变量 。 DOM操作请务必记住缓存(cache) 在jQuery代码开发中,我们常常需要操作DOM,DOM操作是非常消耗资源的一个过程,而往往很多人都喜欢这样使用jQuery: 复制代码 代码如下: $(#loading).html(完毕); $(#loading).fadeOut(); 代码没有任何问题,你也可以正常运行出结果,但是这里注意你每次定义并且调用$(#loading)的时候,都实际创建了一个新的变量,如果你需要重用的话,记住一定要定义到一个变量里,这样可以有效的缓存变量内容,如下: 复制代码 代码如下: var $loading = $(#loading); $loading.html(完毕);$loading.fadeOut(); 这样性能会更好 。 使用链式操作 上面那个例子,我们可以写的更简洁一些: 复制代码 代码如下: var $loading = $(#loading); $loading.html(完毕).fadeOut(); 精简jQuery代码 尽量把一些代码都整合到一起,请勿这样编码: 复制代码 代码如下: // !!反面人物$button.click(function(){ $target.css(width,50%); $target.css(border,1px solid #202020); $target.css(color,#fff); }); 应该这样书写: 复制代码 代码如下: $button.click(function(){ $target.css({width:50%,border:1px solid #202020,color:#fff}); }); 避免使用全局类型的选择器 请勿如下方式书写:$(.something > *); 不要叠加多个ID 请勿如下书写:$(#something #children); 多用逻辑判断||或者&&来提速 请勿如下书写: 复制代码 代码如下: if(!$something) { $something = $(#something ); } 这样书写性能更好: $something= $something|| $(#something); 与其这样书写:if(string.length > 0){..} 不如这样书写:if(string.length){..} 尽量使用 .on方法 尽量使用最新版本的jQuery 尽量使用原生的Javascript |