我正试图在我庞大的javascript UI应用程序中进行一些严重的延迟削减。 我一直在阅读优化代码的方法,从我学到的一些东西,我理解:
这是我在我的应用程序中经常运行的函数中现有代码的一部分:
if($('.textbox').length > 0)
{ $(".textbox").each(function(){
var parts = $(this).attr('id').split('_');
// do some linear-time operations here with $this
});
});
到目前为止,我知道我应该将$this = $(this)
放在.each()
的开头,并且只使用$(this)
。但我还能做些什么呢?有没有更快,替代的方式来使用.each()?我需要使用div
类查看每个 .textbox
。
答案 0 :(得分:1)
你正在使用jQuery,后面执行很多代码。最快的方法是原生Javascript。
真正的小优化是从id
获得this
。你也可以使用这个(Native JS)jQuery执行很多函数):
var parts = this.id.split('_');
例如
尽可能快地获取所有元素。您可以使用此函数按类名获取元素:
if (document.getElementsByClassName == undefined) {
document.getElementsByClassName = function(className)
{
var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
var allElements = document.getElementsByTagName("*");
var results = [];
var element;
for (var i = 0; (element = allElements[i]) != null; i++) {
var elementClass = element.className;
if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
results.push(element);
}
return results;
}
}
循环代码:
var elements = getElementsByClassName(".textbox");
for(var i=0;i<elements.length;i++)
{
var splitid = elements[i].id.split("_");
}
答案 1 :(得分:1)
但我还能做些什么呢?
有几件事:
你的if
语句绝对没有意义(除非它有一个你没有显示的else
子句),因为在一个空的jQuery对象上调用.each
是无操作。删除它。
如果您不想删除它,至少缓存DOM查找的结果,因为每次调用$('.textbox')
jQuery都必须关闭并查询DOM。
id
是DOM元素实例的反射属性,因此$(this).attr("id").split('_')
涉及使用this.id.split('_')
可以避免的多个函数调用和内存分配。
这样就给了我们:
$('.textbox').each(function() {
var parts = this.id.split('_');
// Do something with `parts`
});
或者如果有else
你没有显示:
var boxes = $('.textbox');
if (boxes.length) {
boxes.each(function() {
var part s= this.id.split('_');
// ...
});
}
else {
// ...
}