本文中用到的jQuery版本为v1.12.0
- 使用最新版本的jQuery库
jQuery的每一新版本都会较上一版进行bug修复和优化,同时也会包含一些创新,所以建议使用最新版本的jQuery来提高性能要注意的是:更换版本之后,不要忘记测试你的代码。毕竟有时候不是完全向后兼容的。(如1.7版本后使用
on
来代替bind
,live
) - 使用合适的选择器
-
$("#id")
使用id来定位DOM元素无疑是最佳提高性能的方式,因为jQuery底层将直接调用本地方法document.getElementById()
。
熟悉JS的人都了解这个方法直接通过元素id返回对应的元素。当然,如果该方式不能直接获取所需元素,可以考虑使用.find()
方法。$("#parent").find(".child");
使用上面的代码可以有效的缩小定位的DOM元素。为了提高性能,建议从最近的id元素开始往下检索。
-
$("input"),$("div")
标签选择器的性能也是不错的,它是性能优化的第二选择,因为jQuery将直接调用本地方法document.getElementsByTagName()
来定位DOM元素。
-
$(".class")
这种方法较我们来说有些许复杂。对于较新的浏览器如常用的chrome
,Firefox
等,支持本地方法document.getElementsByClassName()
,而对于老版本的浏览器如IE8
就只能靠DOM搜索的方式来实现
这方法无疑对性能产生较大的影响,所以建议大家有选择性的使用它。
$("[attribute=value]")
利用属性定位DOM,本地JS方法中并没有直接地实现,大多都是使用DOM搜索方式来达到效果,很多现代浏览器支持document.querySelectorAll
方法,但是不同浏览器间的性能还是有区别。
总体来说,使用给方式定位DOM元素,性能并不是非常的理想。$(":hidden")
和上面利用属性定位DOM元素的方法类似,这种伪选择器同样没有直接的JS方法实现,并且jQuery需要遍历每一个元素来定位该选择器,这将对应用带来比较大的性能问题。能不用尽量不用该方法。
假如坚持使用这种方式,可以先使用ID选择器定位父元素,再使用该选择器,这对性能优化有帮助。
$("#parent_id").find(":hidden");
$("#radio_group").filter(":checked");
以上是使用选择器的基本规则,性能自上而下依次下降,大家在开发中可以遵循这个简单的优化性能规则。
###无聊的性能对比时间
```
function getEleById () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = document.getElementById('test');
};
endTime = new Date();
console.log("使用 document.getElementById('test') 方法获取元素花时:"+(endTime - beginTime));
}
function jqueryId () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = $("#test");
};
endTime = new Date();
console.log("使用 $('#test') 方法获取元素花时:"+(endTime - beginTime));
}
function jqueryTagName () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = $("div");
};
endTime = new Date();
console.log("使用 $('div') 方法获取元素花时:"+(endTime - beginTime));
}
function jqueryClassName () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = $(".test");
};
endTime = new Date();
console.log("使用 $('.test') 方法获取元素花时:"+(endTime - beginTime));
}
function jqueryAttribute () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = $("[data-id=test]");
};
endTime = new Date();
console.log("使用 $('[data-id=test]') 方法获取元素花时:"+(endTime - beginTime));
}
function jqueryPseudoClass () {
beginTime = new Date();
for (var i = 0; i < count; i++) {
var tempDOM = $(":hidden");
};
endTime = new Date();
console.log("使用 $(':hidden') 方法获取元素花时:"+(endTime - beginTime));
}
上述代码的测试结果为:
![这算不算是性能对比呢?.png](http://upload-images.jianshu.io/upload_images/1484568-3e7c9463e5928d35.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>小Tips:
>1. 尽量使用ID选择器。
>2. 尽量给选择器指定上下文。
####第一部分已完结。未完待续。