2014-10-02 9 views
0

У меня есть вид, где я стилизации TD элемента, основанный на согласованном содержанииПоложения TD в TR

$(".myTable td:contains('red')").each(function() { 
    $(this).addClass('myClass'); 
      var nth = $(this).index(); 
}); 

Он работает отлично. Теперь мне нужно создать TD в строке ниже. Поэтому я подумал, что могу рассчитать положение этого TD и применить к следующему TR

$(".myTable td:contains('red')").each(function() { 
    $(this).addClass('myClass'); 

    var tdNth= $(this).index(); 

    $(this).parent().next('tr').find('td:nth-child(tdNth)).addClass('myClass'); 
}); 

Однако это не работает. Что мне не хватает?

+1

'$ (это) .parent() следующий ('тр') найти ('тд: п-й ребенок (' + tdNth + ')'). AddClass ('MyClass') ; ' –

+1

Вам не хватает') 'после' .find() '%) P – loveNoHate

+1

@ArunPJohny IMHO, используя конкатенацию строк для сборки селекторов, является хрупким и подверженным ошибкам. Лучше использовать '.eq()' и передать числовое значение непосредственно, чтобы найти правильный элемент. – Alnitak

ответ

2

Вы пытаетесь «интерполировать» переменную в константу строки. Это не работает.

Хотя вы могли использование конкатенации для создания соответствующего :nth-child() псевдо-селектор, на мой опыт делает так хрупок и подвержен ошибкам, поэтому я стараюсь избегать делать это везде, где это возможно.

Вместо этого попробуйте:

$(this).parent().next('tr').children().eq(tdNth).addClass('myClass'); 

Вышесказанное также позволяет избежать «офф-на-один» ошибка код пришлось бы так .index() возвращает Нулевое смещение, но nth-child использует один на основе смещения.

+0

За исключением того, что он работает только при использовании 'eq (tdNth-1)', поэтому по-прежнему остается проблемой при использовании 'th' в строке. 'index()' возвращает позицию, основанную на братьях и сестрах, а не на основе братьев и сестер одного и того же типа, но 'eq()' - это индекс согласованных элементов. – Anthony

+0

@ Энтони не уверен, что вы говорите - братья и сестры '' могут быть только те же или '' элементы, так что только если последние существуют, есть какая-то разница. – Alnitak

+0

Правильно, и если последний имеет значение, индекс не будет соответствовать – Anthony

1

Если строки таблицы используйте th для первого столбца, а затем код:

var tdNth= $(this).index(); 

будет индекс td в том числе, что th, так что если это третий столбец и первый столбец th , tdNth будет 3, который не будет работать с:

$(this).parent().next('tr').children('td').eq(tdNth).addClass('myClass'); 

потому eq(tdNth) будет выбор на основании индекса соответствия td с, что бы быть вторым в своем ряду выше, а не третьим. Поэтому вместо того, чтобы использовать:

var tdNth = $(this).parent().children('td').index($(this)); 
$(this).parent().next('tr').children('td').eq(tdNth).addClass('myClass'); 

Это гарантирует, что индекс для обоих основаны на индексе td с и позволяет избежать проблем, внедорожных одним. ..

http://jsfiddle.net/55krupq2/3/

+0

+1 для jsfiddle, как всегда! – santa

+0

Ваш код работает только на удачу. Параметр '$ (this) .parent(). Index ('td')' возвращает -1, и тогда происходит, что '.eq()' принимает это значение, чтобы означать последний столбец в таблице, который случайно оказывается элементом вы пытаетесь изменить. – Alnitak

+0

Тогда почему это работает для 2, 3 и 4 columms, когда я тестировал. И ваше решение работает только потому, что вы принимаете только td siblings. Индекс соответствует «удаче», когда индекс внутри всех братьев и сестер соответствует индексу для выбранного элемента. – Anthony