2014-05-15 34 views
19

由于继承了真正非常格式不正确的HTML的流量,我有一个尴尬的问题。选择几个集合中的第一个元素

基本上我有一些表行是这样的:

<tr class="odd">...</tr> 
<tr class="odd">...</tr> 
<tr class="odd">...</tr> 
<tr class="even">...</tr> 
<tr class="even">...</tr> 
<tr class="even">...</tr> 
<tr class="odd">...</tr> 
<tr class="odd">...</tr> 
<tr class="odd">...</tr> 

而我需要的是一个jQuery选择,这将使我的班每个块的第一要素。这足够清楚了吗?我不知道如何解释它。

在例子情况下,我想行1,4和7

伊夫通过选择每n个孩子做到了这一点,到目前为止,但香港专业教育学院现在意识到这不会工作,因为惯于始终是相同的数每个类的块中的行。

任何帮助,你们可以赞赏,一如既往:)

干杯!

+0

对于前两种,你可以使用'querySelector'返回第一个节点NodeList中。对于下一个街区,我不是100%肯定的,让我想一会儿。 –

+0

是否有可能例如第一个**奇**块存在于3个元素中,第一个**偶数** 2个和最后一个**奇数** 4个? – Mivaweb

+0

@VDesign对于这样的算法,你不想考虑静态模式。 –

回答

28

你需要聘请一些战略性地利用:not()和相邻的兄弟选择:

$('tr.odd:first-child, tr.even:first-child, tr:not(.odd) + tr.odd, tr:not(.even) + tr.even') 

tr:not(...) + tr...位选择任何tr元素,它的前面紧接着一个tr,它们没有相同的类名。你不能动态地做到这一点(例如使用某种通配符),但如果分别指定每个类名称,则完全可能。这将确保您只选择每个连续组中的第一个元素。

需要的:first-child伪原因很简单,因为+将不匹配第一个孩子,因为它意味着一个元件其前面的同级之间的关系。请注意,:first-child仅占首位tr。如果每个tr元素都只有一个类名称,您可以用替换为tr:first-child,但为了清楚起见,我仍然指定它们。

最后但并非最不重要的是,这个双击为有效的CSS选择器,所以你可以在样式表中使用它,如果你喜欢的话。

+2

不错的一个,BoltClock! –

+0

不错的解决方案! –

+0

+1对于CSS伟大:-) – devnull69

-2

循环并检查当前的元素相匹配的最后一个,否则它是第一个它的一套:

var lastClass = false; 
$('tr.odd, tr.even').each({ function() { 
    lastClass = $(this).attr('class'); 
    if($(this).attr('class') != lastClass){ 
     // Do your conditional stuff here 
    } 
} 
+1

'$('tr.odd tr.even')'在这种情况下不会选择任何东西。 –

+3

'尝试'不是一个好答案的解释。确保你一行一行地解释你的答案是什么,或者它最有可能是downvoted –

+1

不要忘记在循环内设置'lastClass',否则if条件将永远为真 – devnull69

10
$('tr.odd:not(.odd+.odd),tr.even:not(.even+.even)') 

这只是需要未跟随另一.odd任何.odd元件,并且这是不跟随另一.even元件任何.even元件。

+1

哼...为什么downvote?我测试了它,它似乎工作... –

+1

+1,如果你解释你的选择器;) –

+3

这个答案也是正确的。它不应该被降低。 – melancia

-5
var prevClass = ''; 
    $('tr').each(function(){ 
    var thisClass = $(this).attr('class'); 
    if (prevClass === thisClass) { 
    //do nothing? 
    } else { 
    //push in array? do something to the row? 
    } 
}); 
+5

请解释你的答案。代码转储不是很好的答案! –

1

这可能会帮助你

$('button').click(function() { 
    var lastGroup = '' 
    $('.groups tr').each(function() { 
     if(lastGroup != this.className) { 
      $(this).css('background-color', 'red'); 
      lastGroup = this.className; 
     } 
    }); 
}); 

解释:遍历所有的TR和验证,如果类名(this.className)等于lastGroup。如果不相等,我们有一个新组(组的第一个元素)。如果相等,则忽略并继续。这将适用于任何使用的类名称。

的jsfiddle:http://jsfiddle.net/bq7zB/

+0

请为此解答添加解释,以便OP能够学习! –

+0

好的,解释。英语不是我最好的。抱歉 –

相关问题