简单的jQuery入门指引


Posted in Javascript onJuly 28, 2015

引言

jQuery可以说是web开发领域应用最为广泛的轻量级javascript库,不仅专业的web开发者使用它,很多刚入门的web开发者或者web爱好者也通过使用jQuery轻松地融入到了javascript的开发。

而如果你还希望在这方面做得更好,就应学习和了解最佳实践。最佳实践(Best Practice)是随某一技术领域的发展而逐渐建立起来的关于最新技术和开发方法的信息,在web开发领域也非常有用。

本文内容参考了杰出前端工程师 Addy Osmani 的 jQuery Performance TIPs & Tricks ,如果有兴趣,你也可以自己看看这位大师的这个演说PPT,Addy Osmani本人也是jQuery的核心团队(jQuery Core teams)的成员之一。
为什么需要遵循jQuery最佳实践

web开发领域对于性能的追求是永不停滞的。jQuery虽然是非常强大的开发工具,但不当的使用方法仍会给浏览器带来额外的工作和负担,也会使开发的web应用占用更多的系统资源,运行起来也更慢。而我们都知道,好的web应用需要的是清爽灵活。

如何判断javascript的性能呢?现在,这种性能测试都可以归纳为运行速度,简单的说,同一项功能,某一种写法如果比另一种写法运行起来更快,那么这种写法就可以实现更好的性能。当然,这里只单纯从性能角度来考虑,并不包含代码的可维护性。如果你想自己测试不同的javascript代码段的性能,推荐使用 jsPerf.com ,这个站点可以帮助你轻松创建javascript性能测试用例,还可以保存和分享测试结果。jQuery团队也使用它进行javascript性能测试。
jQuery使用建议
1.使用最新版

新版本的jQuery提供的API会在性能上有所提升,而且修复了一些存在的bug。由于非常多的网站都在使用jQuery,所以jQuery每一个新版本的更改都会经过非常严格的测试,升级一般都不会带来问题。

此外,新版本的jQuery可能会在API上做非常有用的改动,让开发工作更加简单。比如在jQuery 1.7之前,事件绑定使用bind()、delegate()以及live()这几个方法。虽然都是事件绑定,但每个方法各有针对,这就产生了“什么时候应该使用哪个”的麻烦事。而从jQuery 1.7开始,新增并推荐使用on()和off()这2个方法来完成所有的事件绑定与移除,理解起来就要容易多了。
2.理解你的选择符

在jQuery中,不是所有的选择符(Selectors)都是同等性能的。也就是说,虽然某一些元素你可以用很多种不同的选择符写法来选取,但不要认为它们在性能上也是一样的。

jQuery的选择符的运行速度是不同的,从最快到最慢依次是:

  •     ID选择符($(#ElementId))
  •     元素选择符($(form),$(input)等)
  •     Class选择符($(.someClass))
  •     伪类和属性选择符($(:hidden),$([attribute=value])等)

由于浏览器支持的原生DOM操作方法(比如document.getElementById())就可用,所以ID选择符和元素选择符是最快的。而稍慢的Class选择符是因为IE6-IE8不支持原生的getElementsByClassName(),而在支持这个原生方法的其他现代浏览器中,Class选择符仍是很快的。

至于最慢的伪类和属性选择符,则是因为浏览器并不提供对应功能的可用原生方法。尽管jQuery尝试了使用querySelector()和querySelectorAll()这两个原生选择符API(属于css查询API)来提升部分jQuery选择符在部分现代浏览器中的性能,但综合起来,仍然是比较慢的。当然,这也是在于jQuery对伪类和属性选择符这个API要求较高,不仅要支持input[type="text"]这种css中合法的选择符,还要支持p:first这类用于元素过滤,但在css中不合法的选择符。总之,jQuery的伪类和属性选择符功能很强大,但请慎重使用。
3.缓存你操作的元素

var parents = $('.parents');
var children = $('.parents').find('.child'); //bad

缓存是指保存jQuery选择符的返回结果,方便之后再次调用。每一个$('.whatever')都会重新从DOM中搜索并返回一个jQuery包装集(jQuery collection),因此要避免重复使用。

原生javascript中,建立局部变量来缓存数据或对象,有利于精简代码、优化性能。这里也是一样的道理。
4.链式语法

var parents = $('.parents').doSomething().doSomethingElse();

jQuery中大部分方法都返回jQuery包装集并支持这种链式语法。javasript的性能优化要点之一是最小化语句数,因此链式语法不仅写起来更容易,运行起来也会更快。
5.使用事件代理

利用事件冒泡,指定一个位于dom较高层级的元素(比如document)的事件处理程序,就可以管理某一类型的所有事件。减少了页面中添加的事件处理程序,自然可以提升整体性能。
6.最小化现场更新

如果你进行操作的DOM部分是已经显示的页面的一部分,那么你就是在进行一个现场更新。现场更新需要浏览器重新计算尺寸,涉及到重绘(repaint)和回流(reflow),有较高的性能花费,因此应减少使用。

在新增内容时,建议先把要新增的代码段合并完全,最后再使用单个append()方法添加到页面。而如果元素存在复杂的交互,比如反复地添加和移除,detach()这个针对性的方法就是最佳的选择。
7.不在不必要的时候使用jQuery方法

$('.nav_link').bind('click', function() {
  console.log('nav id: ' + $(this).attr('id'));  //bad
$.data(elem, key, value);  //significantly faster
};

jQuery方法不一定是最好的方法。这里使用$(this).attr('id')获取当前事件元素的ID,为当前事件元素创建了jQuery包装集,然后调用attr()属性获取方法。但这都是额外的性能花费。事实上,this在事件函数内就表示当前事件元素,直接使用this.id就可以获取元素ID,这种原生DOM属性的写法要更快。
8.适当使用jQuery工具函数

操作jQuery包装集的方法(也就是写在$.fn中的方法),其中一部分也有作为jQuery工具函数(直接写在$中的方法)的同类方法。由于jQuery工具函数在使用中不涉及创建jQuery包装集,因此,在部分情况下,可以通过换用jQuery工具函数提升性能。

比如,在DOM中存储数据,一般的做法是:

$('#elem').data(key, value);  //common way

但改为下边的写法会快很多:

需要的注意的是,虽然下面这种方法更快,但作为参数传入的元素不能用选择符,而要用元素本身。
结语

我自己整理和写本文内容时,也感觉很有收获。jQuery是一个很强大的工具,但进一步说,也只提供了web开发的最基本的内容,更高级更复杂的内容,还需要自己不断学习和创作。在这个过程中,遵循最佳实践,养成良好的习惯,会有很大的益处,并逐渐做得更出色!

Javascript 相关文章推荐
extjs之去除s.gif的影响
Dec 25 Javascript
alert中断settimeout计时功能
Jul 26 Javascript
常规表格多表头查询示例
Feb 21 Javascript
JavaScript数值数组排序示例分享
May 27 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 Javascript
DropDownList实现可输入可选择(两种版本可选)
Dec 07 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
PageSwitch插件实现100种不同图片切换效果
Jul 28 #Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 #Javascript
使用Browserify配合jQuery进行编程的超级指南
Jul 28 #Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 #Javascript
JavaScript编程中的Promise使用大全
Jul 28 #Javascript
javascript+html5实现绘制圆环的方法
Jul 28 #Javascript
学习Bootstrap组件之下拉菜单
Jul 28 #Javascript
You might like
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
详谈python read readline readlines的区别
2017/09/22 Python
Django数据库表反向生成实例解析
2018/02/06 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python发送邮件脚本
2018/05/22 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python底层封装实现方法详解
2020/01/22 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
党支部公开承诺书
2014/03/28 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
撤诉申请怎么写
2015/05/19 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书