编写高性能的jQuery代码
jQuery Optimization
现在jQuery已经出现在很多项目中,然而许多同学忽略了他的性能问题以及代码质量问题,
下面是我对jQuery的一些性能方面的学习.
选择器
选择器是jQuery中的核心功能,选择同一个DOM元素我们可以使用不同的方法。但是哪一种是最快的呢?
-
if possible, please use more id selector. id selector is used javascript method getElementById
//bad
('#id')caution: don't use tag to decorate id selector
-
Before using class selector, you'd better add tag. that's is used javascript method getElementsByTagName
//bad
('tag.class')caution: class selector is the slower selector, use less
-
if possible, right more detail
//bad
('.class tag.class') -
when you select children, you'd better use find. the best way that cache the parent.
var parent = $('#parent');
var children = parent.find('children'); -
最慢选择器:伪类选择器和属性选择器,新的浏览器增加了querySelector()和querySelectorAll()方法,可能会使这两类选择器性能提升
-
从父元素选择子元素
- $('child', parent.find('child'),排名第二
- $('child', ('parent').find('child'),排名第三
- $('#parent child')
这种选择适合选择多级子元素,排名第六
- $('#parent > child')
这种选择和上面的相同,排名第五
- .sibling(),排名第四
- $parent.find('child')
这种选择会被转成getElementById,getElementByName,getElementByTagName等javascript原生语法,所以速度最快,排名第一
总结:ID选择器是最快的选择器,建议多用。然后是标签选择器,其次是class选择器
函数
-
使用jQuery的内部函数data()来存储状态
-
尽量使用on方法来绑定事件,因为任何绑定方法都是最终使用on来实现的
代码质量
-
不要在循环中直接操作 DOM:
// 性能差
$.each(myArray, function(i, item) {
var newListItem = ' - '+item+' ';
- ' + item + ' ';
-
对数组循环时,缓存数组长度
for(var i = 0, len = array.length; i < len; i++) {}
-
尽量少使用匿名函数,最好使用类封装
var mo = {
init: function() {} };
-
缓存变量,DOM遍历最消耗性能,所以尽量将重用的元素缓存
height = ('#element').css('height', height);
// 好的做法
('#element');
height = element.css('height', height); -
尽量少使用全局变量
('#element');
// 最好使用var
var ('#element'); -
简单的语句可以使用原生的javascript,因为jQuery最终执行的也是原生的
-
使用链式写法,因为使用链式写法jQuery自动缓存每一步的结果,因此比非链式写法要快
-
尽量少使用$.each进行循环,使用原生javascript的for和while来进行
-
jQuery大部分方法都有两种,例如:.each
$().each是基于jQuery对象的,jQuery对象会占用很多资源,因为他包含很多属性和方法 $.each是基于jQuery方法的,不会占用太多资源,所以尽量使用这种方式
.each(myArray, function(i, item) {
html += '
});
$('#contain').html(myHtml);
10.尽量使用.get(),.post(),因为他们最终也是用的$.ajax()
减少代码嵌套:
减少代码嵌套,对于阅读和维护代码来时都是有益的,通过deffer我们可以减少代码的嵌套
***第一种:***
var request = function() {
var defer = $.Deferred();
$.ajax({url:'data/test.json'})
.done(function(data){
defer.resolve(data);
});
return defer;
};
$.when(request())
.then(function(data) {
console.log(data);
});
***第二种:***
var request = function() {
return $.ajax({url:'data/test.json'});
};
$.when(request())
.then(function(data) {
console.log(data);
});
***第三种:***
$.when($.ajax(url:'data/test.json'))
.then(function(data) {
console.log(data);
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY