不要每次访问循环时访问数组的长度
属性,并在循环开始之前缓存它:
无功mylength = myarray.length;
对于(var i = 0;i < mylength;i++){
做某事
}
在循环外部
执行追加
操作。
直接操作DOM是非常昂贵的,尤其是在循环中不直接
运行DOM:
这个属性很差/
美元。每个(MyArray,
功能(我的项目){
无功newlistitem =+项目+;
$(#球员)。追加(newlistitem);
});
如此好的表演/
var = document.createdocumentfragment(片段);
美元。每个(MyArray,功能(我的项目){
无功newlistitem =+项目+;
frag.appendchild(newlistitem);
});
$(#球员){ 0 }。appendChild(片段);
这也是非常好的。
无功myhtml =;
美元。每个(MyArray,功能(我的项目){
+项目+;
});
$(#球员),Html(myhtml);
代码需要细化。
避免重复。如果你重复做了一些事情,你可能会有问题。
/丑
如果($ eventfade.data('currently)!= 'showing){
eventfade.stop美元();
}
如果($ eventhover.data('currently)!= 'showing){
eventhover.stop美元();
}
如果($ spans.data('currently)!= 'showing){
spans.stop美元();
}
/美丽!!
var = { eventfade elems美元美元美元美元,eventhover,跨越};
美元。每个(合单元,功能(我、元){
如果(elem.data('currently)!= 'showing){
Elem.stop();
}
});
警惕匿名
函数 匿名函数非常痛苦。它们很难调试、
维护、测试或重用。它们应该尽可能地命名函数并将它们封装在对象中,从而实现有效的
管理。
/不好
$(
文档)Ready(函数(){)
$(#魔法)。Click(function(e){
$(# yayeffects)。SlideUp(function(){)
…
});
});
$(#幸福)。负荷(网址+ #独角兽,函数(){())
…
});
});
/好的
var = {
OnReady:函数(){
$(#魔法)。Click(PI。candymtn);
$(#幸福)。负荷(pi.url + #独角兽,PI。unicorncb);
},
CandyMtn:功能(e){
$(# yayeffects)。SlideUp(PI。slidecb);
},
SlideCb:函数(){…},
unicorncb:函数(){…}
};
$(document)。准备(PI。onready);
优化选择
随着越来越多的
浏览器
支持document.queryselectorall(),选择器的负担已经慢慢转移到浏览器,但仍有一些技巧需要注意。
尽可能地优先使用ID选择器:
快速
$(#集装箱div.robotarm);
/相当快
$(#容器)
发现('div.robotarm);
以美元的方式。fn.find更快,因为之前美元的选择器。fn.find不使用jQuery的选择器引擎用来,但使用浏览器document.getelementbyid()
方法。浏览器本机方法更快。
当使用组合器时,可以使右端尽可能地清晰,而左边则不尽可能清晰。
/不优化
('div.data美元。nzalez);
具有/优化
$('。数据TD。nzalez);
尝试使用tag.class对选择器的右边,而左边只使用标签或类尽可能。
避免过分具体:
$('。数据table.attendees TD。nzalez);
在不
影响结果的
情况下向中间部分过度。
$('。数据TD。nzalez);
简单的DOM结构也有助于提高选择器的
性能,因为选择器可能需要几层曲线才能找到元素。
避免使用通配符,任何显性或隐性的通配符,可以减少选择器的性能。
$(按钮> *);
$(按钮)。子();更好。
$(性别:收音机);隐式使用通配符,慢行
$('。性别*电台); / /明确使用通配符,同上,慢
$(性别投入:收音机);嗯,更快
使用事件
代理 事件代理允许一个事件被绑定到一个容器,如一个无序列表UL,而不是绑定到容器中所有元素(例如,列表元素李)。尽管美元。fn.live美元。fn.delegate绑定事件的容器,他们应该使用尽可能多的fn.delegate美元。毕竟,它们清晰的上下文(与当前的上下文是文档相比)要小得多,避免了很多不必要的过滤。
除了提高性能之外,如果将新元素添加到绑定事件的容器中,则这些新元素不必再次绑定事件,这也是一个优势。
/不好(如果列表元素非常多,那么你就悲剧了)
$(李。触发)。Click(handlerfn);
更好:使用美元。fn.live / /事件代理
$(李。触发)。活(听到咔哒声,handlerfn);
为充分利用。fn.delegate: / /事件代理
因为它可以指定特定的上下文
$(# mylist),委托(李。触发',点击',handlerfn);
从DOM
卸载元素并重新操作
DOM操作是很慢的,所以你应该尽量避免直接操作
介绍dom.jquery美元。fn.detach方法在1.4版。它可以卸载DOM中的元素并进行操作,然后在操作之后将其添加到DOM中。
var $表= $(# mytable);
VaR母= table.parent美元(美元);
table.detach美元();
例如,在这里/…给桌子加了很多线。
parent.append美元(表);
使用外部样式表
修改大量元素的样式
当使用美元。fn.css修改超过20个元素的样式,你应该考虑直接风格的标签添加到页面,据说性能可以提高60%。
当使用此方法时,元素小于20,
速度慢时超过20。
$('a.swedberg)。Css(色彩、# asd123);
20个冗余元素,应该考虑直接在页面上添加样式标签。
$('')
appendto(很);
使用美元。数据fn.data代替美元。
应用美元。数据的DOM元素比调用$快10倍。fn.data直接选择。当然,前提是要理解差异的DOM元素和jquery结果之间建立第一。
一般{速度}
$(元)数据(键,值);
快10倍
美元。数据(元素、关键、价值);
不要浪费时间在空元素上
jQuery不会主动告诉您在空白结果集上运行代码,而且在执行过程中没有
错误,所以在执行代码之前,您需要判断结果集是否为空:
不好:在实现了三个函数之后
结果发现没有元素集合
$(# nosuchthing)。SlideUp();
/好的
myselection = $(var $ ' # nosuchthing);
如果(myselection美元。长度){ $ myselection.slideup();}
/ /最好的:添加一个doonce
插件 jquery.fn.doonce =函数(函数){
This.length func.apply(本);
返回此;
}
(李美元。cartitems)。DoOnce(function(){)
在这里您可以确保结果集不是空的。
});
此方法特别适用于jQuery UI方面,因为即使结果集中不包含任何元素,开销也非常昂贵。
变量的定义
您可以在一个语句中定义多个变量:
/旧方法
var测试= 1;
VaR TEST2 =函数(){…};
VaR test3 = test2(测试);
/新方法
var测试= 1,
test2 =函数(){…},
试验= test2(测试);
在自执行函数中,变量甚至不能定义为:
(函数(富,条){ })(1, 2);
条件判断
土壤法
如果(type'foo'type | | = = = = 'bar){…}
/更高级的方法
(如果 / ^(Foo |酒吧)$ /。试验(型)){…}
使用对象查找
如果{({ 1,bar:1 })){ } }…}