2009-12-13 5 views
16

Я пытаюсь выбрать первую строку таблицы. Примечание: первая строка, завернутый в thead тега, так что:jQuery "select all except"

<table> 
    <thead> 
    <tr> <!-- first row --> </tr> 
    </thead> 
    <tbody> 
    <tr> <!-- body --> </tr> 
    </tbody> 
    <tfoot> 
    <tr> <!-- body --> </tr> 
    </tfoot> 
</table> 

'select first row' наконечник мог бы работать, если бы не было тегов обертки. Это то, что я пытался, но не работает:

$("*:not(thead)", tableSelector).remove(); 

есть, я хотел бы избавиться от обоих TBODY и TFOOT селекторов, используя «не TFOOT» селектор. Потому что я хочу удалить все остальное из таблицы, кроме <thead> и всего-внутри-thead. Поэтому в основном я пытаюсь выбрать все, кроме ада и того, что внутри него; интуитивно что-то вроде :not(thead *) может работать, но нет.

Мое обходное решение $("tbody, tfoot", tableSelector).remove();, но я хотел бы узнать и понять, как использовать противоположный (не-селектор).

+0

Это не ясно, что вы пытаетесь сделать здесь. Вы можете перефразировать? – cletus

+0

'' tbody, tfoot ''выглядит лучше всего. Фактически, я собирался предложить его, пока я полностью не прочитаю ваш вопрос. К моменту: ': not (thead)' failed, потому что он также выбрал и удалил 'tr'. – Kobi

+0

Итак, нет такого селектора, как «thead и его дети», поэтому я мог бы сказать: нет (thead-and-its'children)? – Martin

ответ

20

Ваш вопрос не совсем ясен. Для того, чтобы выбрать первую строку в одной таблице:

$("table tr:first")... 

или наоборот:

$("table tr:not(:first)")... 

будет делать это, но что сломается, если есть более чем одна таблица (она будет выбирать только одну строку, даже если есть три таблицы). Вы можете обойти это с:

$("table").each(function() { 
    $(this).find("tr:first")... 
}); 

Вы можете получить все строки, а не в THEAD с:

$("table > :not(thead) > tr")... 

Edit: Я думаю, что вы чрезмерно усложнять это. Если вы хотите, чтобы удалить все, кроме THEAD и его содержание, что относительно просто:

$("table > :not(thead)").remove(); 

Если вы хотите оставить TBODY и TFOOT элементы в месте изменить его на:

$("table > :not(thead) > tr").remove(); 
+1

Хорошо, чтобы было ясно. Выберите первый ряд ВМЕСТЕ С ЕГО ТЕА. Потому что я хочу удалить все остальное из таблицы, кроме '' и все внутри thead. – Martin

+0

+1 для «вашего вопроса не совсем понятно» ;-) – Frunsi

+0

+1 для покрытия всех возможностей. :-) – Nagri

1

Использование children() на Селектор таблицы будет выбирать только прямых детей. Вы можете отфильтровать это, используя неселектор.

$(tableSelector).children(':not(thead)').remove(); 
+0

Это примерно на 30 раз медленнее, чем использование только селекторного решения. – vrutberg

+0

Упомяните об этом? Мое простое тестирование показывает мне, что ваше решение занимает в среднем 400 мс для 1000 итераций, а мое занятие занимает чуть больше 300 мс для тех же 1000 итераций. – tvanfosson

+0

... обратите внимание, что в моем тесте я делал hide/show, а не удалялся по очевидной причине. – tvanfosson

1

Я пытаюсь выбрать первую строку таблицы.

Почему бы не использовать старый добрый DOM?

mytable.rows[0] 
+0

Я хочу, чтобы THEAD шел по столь простым рядам, не разрезал его. – Martin

+0

Кроме того, я хочу удалить все остальное из таблицы, поэтому просто выбор строк не дает мне нигде. – Martin

0

Если вы хотите, чтобы удалить child oftable кроме thead, попробуйте этот селектор:

table > *:not(thead) 

Редактировать Поскольку вы указали, что у вас уже есть таблицы в переменной:

$("> *:not(thead)", context) 
+0

Опять же, я хочу использовать спецификатор conetxt. $ (xx, context) – Martin

+0

Нет .. это тоже не работает. Он удаляет все.Только «tbody, tfoot», похоже, работает до сих пор. – Martin

+0

@Martin: И контекст - это просто ваш стол? Как '$ (" table ")'? – Gumbo

0

Команда «: не» псевдо-селектор принимает другой селектор в качестве параметра, так что вы можете удалить все, кроме этого, и что, как это:

$(':not(thead, thead *)', 'table').remove(); 

Вы можете see it in action here.

Это очень похоже на то, что вы написали в your comment, за исключением того, что вы не использовали контекст (который удалил узел таблицы), и вы использовали дочерний операнд, который не включал «все» внутри thead, но вместо этого включили только его прямых детей. Удаление дочернего операнда «>» исключает всех потомков узла, а не только прямых детей.