2009-10-27 2 views
2

Я пытаюсь удалить все строки из таблицы КРОМЕ совпавших строк:JQuery Удаление всех, кроме соответствующих строк

Этот код удаляет те строки, которые я на самом деле хотите сохранить -

$("table#traffic").each(function() { 
    $("td:contains('" + selected_text + "')").parent().remove(); 
}); 

Я в основном хочу сделать противоположное вышеизложенному.

ответ

0

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

$("table#traffic td:not(:contains('" + selected_text + "'))").parent().remove(); 
1

На первый взгляд, я запутался - вы делаете функцию .each() на каждом матче («таблицы # трафика»), но тогда вы не интегрируя $ (this) в любую вашу функцию .each(), которая говорит мне, что вы можете полностью исключить цикл .each().

Что касается вашего вопроса, то: не работает селектор с: содержит?

$("td:not(:contains('" + selected_text + "'))").parent().remove(); 
+0

Вы правы, функция 'each', показанная в исходном сообщении, не помогает здесь. Вместо этого он может быть объединен в один селектор (но это все еще не затрагивает проблему «соседей», которые не содержат выделенный текст, вызывающий удаление строки, независимо от того, как я заметил в другом месте). – Funka

1

Функция удаления также может принимать выражение в качестве опции.

$("table#traffic tr").remove(":not(:contains('" + selected_text + "')")); 

Интересно, что следующие профили немного быстрее с целым рядом рядов. Я полагал, что вызов parent() будет потреблять больше времени.

$("table#traffic td:not(:contains('" + selected_text + "'))").parent().remove(); 

Таким образом, я думаю, вы можете пойти с тем, что вам будет лучше читать.

0

Я удивлен, что никто не упомянул filter метод ... Из документов:

фильтр (выражение)
Удаляет все элементы из набора подобранных элементов, которые не соответствуют указанное выражение (и). Этот метод используется, чтобы сузить результаты поиска ...

Так что, возможно, что-то вроде этого?

$("table#traffic tr") 
    .filter(':has(td:contains('" + selected_text + "'))') 
    .remove(); 

Конечно, можно по-прежнему использовать комбинацию not для достижения того же выбора (есть много других способов кожи этого кота). Я просто подумал, что буду упомянуть функцию filter, так как это то, для чего она есть.

Наконец, я также хочу отметить, что ни один из подходов, на которые вы ответили до сих пор, не описывает очень вероятную ситуацию, когда вы закончите удаление строк, которые вы не хотите! Например, если строка содержит несколько ячеек, вы не хотите, чтобы только один из этих ячеек в строке, не содержащей ваш текст, чтобы удалить всю строку! Обратите внимание, что в моем решении выше фильтрация выполняется на уровне строки, а не на уровне ячеек. (Я не проверял это, поэтому, пожалуйста, не прыгайте на меня, если это не работает точно так же, как есть!)

Удачи!
-Mike

+0

На самом деле, первая строка кода в ответе ScottE кажется, что у меня не было бы побочного эффекта, о котором я предупреждал (но его вторая строка кода была бы). – Funka

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