JQuery: содержит с HTML - PullRequest
       4

JQuery: содержит с HTML

3 голосов
/ 06 апреля 2011

У меня есть таблица, которая содержит разделенные запятыми списки чисел, такие как: <td>72,76,81</td>. Я пытаюсь выбрать ячейки таблицы, которые не содержат конкретное число. Этот селектор работал:

$("td:not(:contains('76'))", $table)

Проблема в том, что могут быть строки, содержащие '576' или '761' и т. Д.

Чтобы решить эту проблему, я решил поставить <span> вокруг каждого числа, так что теперь это: <td><span>72</span>,<span>76</span>,<span>81</span></td>. Мой селектор сейчас:

$("td:not(:contains('<span>76</span>'))", $table)

Когда я отлаживаю этот селектор в Firebug, он возвращает некоторый тег span, который на самом деле не существует в источнике HTML, вместо правильных <td> s.

По сути, помещение '<span>' в строку :contains() приводит к поломке селектора. Есть ли селектор, подобный :contains(), который будет работать правильно, когда ему передается HTML? Или есть какой-то способ, которым я могу выбрать по всей строке внутри <span>?

Кстати, этот сайт использует jquery 1.3.2.

Ответы [ 6 ]

5 голосов
/ 06 апреля 2011

Если вы хотите придерживаться <span> s, это работает, даже с jQuery 1.3.2:

var $tds = $("table td").filter(function() {
    return !$(this).find('span').filter(function () {
        return $(this).text() === '76';
    }).length;
});

http://jsfiddle.net/mattball/PFk8H/


С другой стороны, это действительно просто, если вы хотите вернуться к старой разметке:

var $tds = $("table td").filter(function() {
    return !$(this).text().match(/\b76\b/);
});

http://jsfiddle.net/mattball/L6AFz/


Чтобы использовать переменную в регулярном выражении, используйте синтаксис конструктора new RegExp(string) :

var n = 76,
    re = new RegExp("\\b" + n + "\\b");

var $tds = $("table td").filter(function() {
    return !$(this).text().match(re);
});

http://jsfiddle.net/mattball/hKQH7/

2 голосов
/ 06 апреля 2011

попробуйте это:

$ ("td span: not (: содержит ('76 '))", $ таблица) .parent ()

$("td span", $table).filter(function(){return $(this).text() != '76';}).parent()
1 голос
/ 06 апреля 2011

Протестировано с jQuery 1.2.6

http://jsfiddle.net/G27JF/4/


$("td>span").filter(function() { 
    return ($(this).text() != 76);
}).parent().css("text-decoration", "underline");

1 голос
/ 06 апреля 2011

Возможно, вы не сможете использовать :contains для этого. Как вы сказали, :contains('76') будет соответствовать '76', '576', '761' и т. Д. Вы можете попробовать использовать .filter, чтобы получить то, что вы хотите.

$('td:has("span")').filter(function(){
    var x = true;
    $('span', this).each(function(){
        x = x && $(this).text() != '76';
    });
    return x;
});

Демо: http://jsfiddle.net/KvK3J/

0 голосов
/ 06 апреля 2011

Чтобы избежать проблемы «Содержит», вы должны сделать их как классы:

<span class="76"></span>

И:

$("td:not(:has(span.76)"), $table)

Это можно настроить так, чтобы иметь кратные значения в 1 объекте как:

<span class="76 77 78"></span>

Или даже вставить само ТД, еще больше упрощая селектор

$("td:not(.76 .77, $table)
0 голосов
/ 06 апреля 2011

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

Вот базовый элемент, который будет соответствовать:

/^76$/g

Извлечь RegExr , чтобы построить большерегулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...