众所周知,jquery现在已经非常流行,百度新凯发推荐首页中也已经开始使用jquery,今天总结下怎么书写更好的jquery代码使jquery代码更好、更快的执行,希望本篇jquery教程一改大家以前不合理的做法。
1.正确引用jquery
-
尽量在body结束前才引入jquery,而不是在head中。
-
借助第三方提供的cdn来引入jquery,同时注意当使用第三方cdn出现问题时,要引入本地的jquery文件。
-
如果在前引入script文件的话,就不用写document.ready了,因为这时执行js代码时dom已经加载完毕了。
2.优化jquery选择器
高效正确的使用jquery选择器是熟练使用jquery的基础,而掌握jquery选择器需要一定的时间积累,我们开始学习jquery时就应该注意选择器的使用。
如果我们选择class为home的a元素时,可以使用下边代码:
$('.home'); //1 $('#nav a.home'); //2 $('#nav').find('a.home'); //3
方法1会使jquery在整个dom中查找class为home的a元素,性能可想而知。
-
方法2为要查找的元素添加了上下文,在这里变为查找id为nav的子元素,查找性能得到了很大提升。
-
方法3使用了find方法,它的速度更快,所以方法三最好。
-
关于jquery选择器的性能优先级,id选择器快于元素选择器,元素选择器快于class选择器。因为id选择器和元素选择器是原生的javascript操作,而类选择器不是,大家顺便可以看下find context 区别,find() children区别。
3.缓存jquery对象
缓存jquery对象可以减少不必要的dom查找,关于这点大家可以参考下缓存jquery对象来提高性能。
4.正确使用事件委托
事件委托可以使事件更好的执行,在动态添加的元素上绑定事件也需要委托来实现,在新版本的jquery中推荐大家使用on来给元素绑定一个或多个事件的处理函数。
我是单元格 |
比如我们要在上边的单元格上绑定一个单击事件,不注意的朋友可能随手写成下边的样子:
$('#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代码
如在上述代码中我们对jquery代码进行了适当的合并,类似的还有.attr()方法等,我们没有写成下边的方式:
$('#t').on('click', 'td', function () { $(this).css('color', 'red').css('background', 'yellow'); });
6.减少dom操作
刚开始使用jquery时可能会频繁的操作dom,这是相当耗费性能的。如我们要在body中动态输出一个表格,一些朋友会这样写:
var $t = $('body'); $t.append(''); $t.append(''); $t.append('
1 |
好的做法:
$('body').append('
1 |
这样在拼接完table串后再添加到body中,对dom的操作只需一次。群里以前有朋友就因为这个导致在ie下输出时出现问题,而关于字符串的拼接可以参考下最快创建字符串的方法。
7.不使用jquery
原生函数总是最快的,这点不难理解,在代码书写中我们不应该忘记原生js。
就先总结这几条吧,每条建议并不难理解,但总结全面的话还是要花费不少时间的。如在减少代码段中,如果需要根据条件从数组中得到新数组时,可以使用$.grep() 方法,如果你在使用jquery时有自己心得的话,欢迎在留言中和大家分享!
5 楼 2014-09-10 09:47
4 楼 2014-09-09 14:14
比如你的服务器在北京,用户在上海,如果你用cdn,上海的cdn就会响应用户请求,当然会比你北京的服务器发送好的多.当然,如果cdn有问题 你可以退回到本地js.
我想问一下,既然还是要判断引入本地的js。为何还引入第三方js。直接引入本地不就好了么?
3 楼 2014-09-09 11:58
我想问一下,既然还是要判断引入本地的js。为何还引入第三方js。直接引入本地不就好了么?
2 楼 2014-09-09 10:53
1 楼 2014-09-04 19:04