2012-05-16 3 views
0

Мне нужно добавить класс в tr, когда он содержит td, содержащие определенные значения.Добавить класс в строку таблицы, содержащую столбцы с определенными значениями

Используя ответ на вопрос this question on SO, я подумал, что нашел решение, но он не работает в строках, содержащих несколько столбцов - он работает только в том случае, если есть один номер td.

Как я могу идентифицировать строки таблицы, содержащие столбцы с определенными значениями, среди других столбцов? Обратите внимание, что столбцы не всегда будут в определенном порядке, поэтому это должен быть динамический ответ.

The jsFiddle

<table> 
    <tr> 
     <td>Hey!</td> 
     <td>Other column</td> 
     <td>Yo!</td> 
     <td>Other column2</td>   
    </tr> 
</table> 

<script type="text/javascript"> 
$('tr').each(function(){ 
if (($(this).find('td').text() == 'Hey!') && ($(this).find('td').text() == 'Yo!')) 
{ 
    alert('here'); 
    $(this).addClass('disabled'); 
} 
}); 
</script> 

ответ

1

Как уже упоминалось, использовать JQuery в :contains(text) селектор:

$('tr').each(function(){ 
    if($('td:contains("Hey!")', this).length && $('td:contains("Yo!")', this).length){  
     alert('here'); 
     $(this).addClass('disabled'); 
    } 
}); 

Что-то в этом роде.

Редактировать

Обновлено мой ответ на использование length вместо size() функции JQuery в. Престижность тем, кто опубликовал доказательства в поддержку идеи о том, что использование length происходит быстрее. После того, как я сделал некоторые базовые исследования, наткнулся на это в документах jQuery:

Метод .size() функционально эквивалентен свойству .length; Однако свойство .length является предпочтительным, поскольку оно не имеет служебных данных вызова функции.

Учитывая, что плюс тестовый пример ниже, я продан. Интересно, почему size() существует? Я думал, что это связано с тем, что некоторые объекты, возвращаемые jQuery, не являются массивами, но только ведут себя как, как массивы, и что при условии, что использование size() было предпочтительным. Похоже, что позже, по крайней мере, это не так.

Приветствия

+0

Я обновил свой ответ на использование ': contains (text)', как указывали другие. Однако я считаю, что мой ответ является единственным, который будет «отключать» строку, если он содержит * оба значения текста. – Madbreaks

+0

'длина' всегда лучше. – VisioN

+0

@ ВизиоН Говорит вам? – Madbreaks

1

насчет:

$('td:contains("Hey!"),td:contains("Yo!")').parent('tr').addClass('disabled'); 

?

Или обеспечить ОБА есть

$('tr').each(function(){ 

    if($('td:contains("Hey!")').length > 0 && $('td:contains("Yo!")').length > 0) 
     $(this).addClass('disabled'); 

}); 

+2

Не думаю, что будет работать, хотя мне нравится идея использования 'contains'. Ваш селектор «отключит» 'tr', который содержит ячейки с/или текстовыми значениями. Похоже, что op хочет отключить, если оба значения найдены. – Madbreaks

+0

Да, я перечитал вопрос и заметил, что может быть так, просто тестировал что-то в скрипке, прежде чем публиковать второй пример кода (просто задался вопросом, могу ли я сделать это снова в одном селекторе, но я не мог понять это) – Lee

0

Используйте contains selector

$("td:contains('Hey!'), td:contains('Yo!')").each(function(){ 
    alert('here'); 
    $(this).parent().addClass('disabled'); 
}); 
+1

Что делать, если в строке таблицы есть ячейка с "эй!" но не ячейку, которая имеет «Yo!»? Он все равно «отключит» строку, верно? – Madbreaks

+0

Хорошая точка :) Другие обновили свои ответы, чтобы проверить это условие, поэтому я не буду обновлять мои. –

0

Это одно решение:

var search = ["Hey!", "Yo!"]; 

$("tr").filter(function() { 
    var found = 0; 
    $(this).children().each(function() { 
     var text = $(this).text(); 
     for (var i = 0; i < search.length; i++) { 
      if (text == search[i]) found++; 
     } 
    }); 
    return found == search.length; 
}).addClass("disabled");​ 

DEMO:http://jsfiddle.net/Tnq9A/1/


Если вам не абсолютное совпадение текстов, но частичное, вы можете использовать это сравнение метод:

if (text.indexOf(search[i]) != -1) found++; 

DEMO:http://jsfiddle.net/Tnq9A/2/

+0

Функция фильтра вернет значение 'true', если оно найдет либо значение, но оно должно возвращать только true, если оно находит * both *. – Madbreaks

+0

Право. Возможно, я неправильно понял этот вопрос. * Теперь он работает по мере необходимости *. – VisioN

Смежные вопросы