2013-07-17 61 views
1

早上好,jQuery选择与条件“属性”小于

只是我的知识的渴望,我感兴趣的问题,如果有优化下面的简单功能的可能性。

$('.item').each(function(){ 
    var el = $(this); 
    if (el.data('timestamp') < 1374033452) 
     el.addClass('processed'); 
}); 

可能发生,对于选择“.item”过百的回报,在最坏的情况下甚至数千个元素,这是不是真的表现非常好。 时间戳是一个添加到每个.item的数据属性的unix时间戳值。

亲切的问候,

多米尼克

+0

如果时间戳在HTML。接着,添加使用的getAttribute可能更快。但我不知道这是否会产生真正的影响。 –

+0

最好在CodeReview.SE上询问这个问题,因为它是关于工作代码的。 –

+0

如果您不得不多次发布这些信息,可能会安排后续评估速度更快的事情。 – mvw

回答

1

的jQuery增添了不少的开销。你可以去快十倍以上通过只用香草JS:

var elements = document.getElementsByClassName('item'); 
for (var i=elements.length; i-->0;) { 
    if (elements[i].getAttribute('data-timestamp') < 1374033452) { 
    elements[i].className = 'processed'; 
    } 
} 

(注意,我认为你可以取代所有类,而不仅仅是加)

JSPerf

但是性能问题,你经验可能更多地与reflow的成本相关,而不是简单的JavaScript执行。例如,如果processed类更改元素的尺寸,则可能会强制进行大回流。有可能在这里找到比单纯的jQuery/JavaScript更多的收获。

+0

+1原生 –

+0

@ArunPJohny我刚刚在Firefox上进行了测试(请参阅[perfs](http://jsperf.com/jquery-each-vs-filter/2))。结果令人印象深刻,也许很奇怪... –

+0

男人,看起来不错:) –

1

你可以尝试像

$('.item').filter(function(){ 
    return $(this).data('timestamp') < 1374033452 
}).addClass('processed'); 

样品:Profiling

+1

会更快吗?我不明白为什么。 –

+1

@dystroy边缘根据此分析http://jsperf.com/jquery-each-vs-filter –

+0

这很有趣。有一个真正的收益。这可能与addClass函数开始时的大量开销有关。从我+1。 –

1
$('.item').addClass(function(){ 
    return this.getAttribute('data-timestamp') < 1374033452 ? 'processed' : ''; 
}); 
+0

+1再次您的情况逆转,现在是一个边际+ 3%http://jsperf.com/jquery-each-vs-filter –

+0

@ArunPJohny - 哦,没注意到我扭转了这种情况,谢谢。至于速度,它是如此微不足道,无论如何不重要,但我很惊讶,使用本地getAttribute时,过滤器比这个更快。 – adeneo

0

我不认为你可以围绕解决它的第一次,但后续调用,你可能可能与此:

$(".item:not('.processed')").each(function(){ 
    var el = $(this); 
    if (el.data('timestamp') < 1374033452) 
     el.addClass('processed'); 
}); 

但我不知道这是否符合您的用例。

http://api.jquery.com/not-selector/