2012-02-01 70 views
2

也许这不会导致任何明显的性能差异,但我只是感兴趣。如果我正在使用jQuery去除元素列表中的类,那么将该类包含在选择器中是更好的练习还是性能?使用jQuery删除类时,将类包含在选择器中会更好吗?

所以将它包含:

$('#myList li.classToRemove').removeClass('classToRemove'); 

或不包括它:

$('#myList li').removeClass('classToRemove'); 

所以基本上是没有在选择,并在removeClass方法缩小列表中的任何差异。

回答

2

选择器向后匹配(最后到第一个),这意味着它将首先找到“具有”classToRemove“的所有元素,它们也是”li“,它们也是”#mylist“”的子元素。

这样做尽可能地缩小了名单的范围。

因此,你应该

$('#myList li.classToRemove').removeClass('classToRemove'); 

少的项目,以配合去意味着更快,更高效的脚本。

+0

我认为它不会改善任何事情,这只是JQuery必须做的另一个检查。多余的。 – gdoron 2012-02-01 20:43:41

+0

错误的是,它不会检查每个li,而是首先搜索每个'.classToRemove',这将进一步缩小列表的范围。请参阅以下文章:http://css-tricks.com/efficiently-rendering-css/ – 2012-02-01 20:46:25

+0

我误解了这个问题。你说得对,我以为他在问别的。 ** + 1 ** – gdoron 2012-02-01 20:52:29

2

假设并非所有<li>元素都具有该类,那么我会说最好在过滤集上运行.removeClass()

但整体而言,还会有其他的事情,这将有上的表现,就像一个冲击......

  • 通过'#myList li'匹配的元素VS '#myList li.classToRemove'

  • 的方式不同环境中的数优化其DOM选择

  • .removeClass()方法的内部在不同环境之间的实际性能差异

所以,除非你在讨论在一大部分元素上不必要地运行.removeClass(),否则我不会担心它太多。

+1

对于“元素的大子集”+1。用'.removeClass('classToRemove')打''''没有那个类将会是一个微小的命中。除非你有数百万个'li's:P – 2012-02-01 20:49:46

0

使用更具体的选择器将提高性能,但不会影响.removeClass()的结果。

想像添加到选择器中的每个添加项,如下钻。鉴于下面的HTML:

<div id="myList"> 
     <ul> 
      <li id="li1"></li> 
      <li id="li2"></li> 
      <li id="li3" class="classToRemove"></li> 
     </ul> 
    </div> 

    //In order of fastest to slowest: 
    //Selecting the exact li and calling removeClass once 
    $('#li3').removeClass('classToRemove'); 

    //In this one we are skipping 2 li's and then calling removeClass once 
    $('#myList li.classToRemove').removeClass('classToRemove'); 

    //In this one we have to call removeClass 3 times 
    $('#myList li').removeClass('classToRemove'); 
0

对不起撞到一个旧的职位。

this page的测试似乎表明不包括类选择器约10-15%更快。所以,如果你想使用jQuery,最好的办法就是:

$('#myList li').removeClass('classToRemove'); 
  • 注意 - 此页面确实出现了使用jQuery 1 ...