Выберите любой TR, где текст TD содержит foo

Я уверен, что это можно сделать, не вдаваясь в функцию, но я хочу захватить любой TR, где есть примеры <td>Mail ...</td> или <td>Foo ... </td>.

Я постоянно думаю, что это должно выглядеть как

$('tr[./text()^="foo"]'), но хром ему это не нравится. или $('tr[./td/text()^="Mail"]'), но не повезло это можно сделать с помощью простого селектора?

Ответ 1

Я очень удивлен, что никто не придумал этого, может быть, мой вопрос был слишком расплывчатым.

$('tr:has(td:contains("Leather"))').hide()
$('tr:has(td:contains("Mail"))').hide()
$('tr:has(td:contains("Cloth"))').hide()
$('tr:has(td:contains("Bow"))').hide()
$('tr:has(td:contains("Gun"))').hide()

Идет, чтобы сделать его букмарклетом для поиска брони и оружия для dk или pally

Ответ 2

Одно из возможных решений:

$('td').filter(function() {
    return $(this).text().indexOf('Foo') === 0;
}).closest('tr');

Вы должны использовать .filter() для работы над текстом элемента (вы не можете сделать это с помощью селектора, по крайней мере, не путь, который вы хотите), и .closest() должен быть самообучающимся.

Изменить: но это может несколько раз выбирать элементы <tr>. На самом деле я не знаю, как это работает jQuery. Другим решением было бы использовать два вложенных filter (на tr и на td, но как-то это кажется неэффективным).

Edit2: Начиная с версии 1.4.4, jQuery кажется достаточно умным, чтобы иметь дело с несколькими встречами одного и того же элемента (т.е. работает как набор). DEMO здесь (если вы перейдете к версии 1.4.2, вы увидите, что первая строка выбирается дважды).

Ответ 3

Существует "содержит:"

TD:contains("Mail")

Но это просто ищет Mail в любом месте элемента (нет "начинается с" ).