Подтвердить что ты не робот

Выберите первый элемент из нескольких наборов

У меня есть неудобная проблема из-за наследования shedload действительно, действительно плохо отформатированного 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-й ребенок, но теперь я понял, что это не работает, поскольку в каждом блоке классов всегда будет одинаковое количество строк.

Любая помощь, которую вы, ребята, можете дать ей, как всегда:)

Ура!

4b9b3361

Ответ 1

Вам потребуется использовать стратегическое использование :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.odd:first-child, tr.even:first-child на просто tr:first-child, если каждый элемент tr будет иметь ровно одно из двух имен классов, но я все равно укажу их для ясности.

И последнее, но не менее важное: это удваивается как допустимый селектор CSS, поэтому вы можете использовать его и в таблице стилей, если хотите.

Ответ 2

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

Это просто принимает любой элемент .odd, который не следует за другим .odd и любым элементом .even, который не следует за другим элементом .even.

Ответ 3

это может помочь вам

$('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/

Ответ 4

Прокрутите и проверьте, соответствует ли текущий элемент последнему, иначе он будет первым из его набора:

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

Ответ 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?   
    }
 });