2009-07-16 3 views
15

У меня есть таблица с более чем 9 рядами.Цепочки селекторов jQuery: lt и: gt

Если я это сделаю: $('table tr:gt(3):lt(6)'), я получу 3 или 6 элементов в конце и почему? Используются ли все селекторы для одного и того же первичного отбора или они применяются последовательно к различным выборам?

ответ

28

Они применяются последовательно, поэтому сначала вы отфильтровываете первые четыре элемента (:gt(3)), затем вы отфильтровываете все элементы после шестого (:lt(6)) элемента уже отфильтрованного набора.

Представьте этот HTML:

<br/><br/> 
<br/><br/> 
<br/><br/> 
<br/><br/> 
<br/><br/> 
<br/><br/> 

Затем выполните следующие действия JQuery:

$('br:gt(3):lt(6)').addClass('sel'); 

Теперь у вас есть:

<br/><br/> 
<br/><br/> 
<br class="sel"/><br class="sel"/> 
<br class="sel"/><br class="sel"/> 
<br class="sel"/><br class="sel"/> 
<br/><br/> 
+5

Обратите внимание, что селектора ': lt (n)' и ': lt (n)' являются 0-индексированными и не включены. – Blixt

+0

Хорошо отметил, спасибо. – glmxndr

+0

спасибо, сэр очень полезно! – GianFS

1

По какой-то причине :lt(6) будет игнорироваться в этом выборе , поэтому в этом случае он вернет все, что больше 3.

Однако, если вы переключить его, он будет работать, как ожидалось

$('table tr:lt(6):gt(3)') 

вернет 2 строки (только строка 4 и 5 между 6 и 3).

** редактировать: ** используя v.1.3.2

А также, lt(6) не игнорировали, а не просто работает, как я ожидал, что это. Таким образом, :gt(3):lt(6) фактически вернет 6 элементов (если у вас достаточно строк, то есть)

+0

Не работал таким образом на образце, который я пробовал. Какую версию jQuery вы используете? – tvanfosson

+1

Не верно, ': lt (6)' будет применено, вы просто не видели его, потому что ': gt (3)' возвратили более 6 элементов.Тем не менее, он будет работать, как вы сказали, если вы переключите их. – Blixt

+0

aha! поэтому он фильтрует все, что больше 3, а затем новый фильтр на то, что когда-либо получено от этого ... приятно. – peirix

24

Вместо этого я предлагаю использовать метод slice().

http://docs.jquery.com/Traversing/slice#startend

$('table tr').slice(2, 5).addClass("something"); 
+1

Не отвечает на вопрос, но является более четким способом сделать выбор. – tvanfosson

+0

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

+0

Да, это действительно полезно, хотя он частично отвечает на вопрос. +1 хотя :) – glmxndr

3

Не совсем то, что вы могли бы think-

Working Demo

В принципе, второй фильтр применяется последовательно, для согласованного набора первого фильтра.

Например, на столе с 10 строками :gt(3) будет фильтроваться на элементы 5 - 10, тогда :lt(6) будет применен к 6 элементам, а не к фильтрации.

Если вы добавите /edit к демо-URL, вы можете играть с селектором и сами убедиться. Если вы измените второй фильтр на :lt(2), вы получите строки 5 и 6, выделенные красным