Получение диапазона элементов в одном селекторе jQuery

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

$('table tr:gt(2):lt(5)');

Я думал, что это даст вам только ряды № 3 и № 4, но в итоге вы получите больше. Как я могу указать селектору выбирать только строки № 3 и № 4?


person Bob    schedule 23.12.2009    source источник
comment
См. также .slice().   -  person Peter Krauss    schedule 22.02.2013


Ответы (3)


Вы довольно близки, но проблема в вашем селекторе - это фильтр :lt(5).

Вы хотели бы что-то вроде:

$('table tr:gt(2):lt(2)');

Отличие в том, что к моменту применения фильтра lt() первые три элемента уже были удалены из набора (по фильтру gt()). Таким образом, это захватит 3-й и 4-й элементы (с нулевым индексом) вместо 3-го по 8-й.

person Alex Sexton    schedule 23.12.2009
comment
Я полагаю, в качестве побочного вопроса, где я могу отправить запрос функции, чтобы добавить селектор диапазона, чтобы он мог выглядеть примерно так: $('table tr:in(2,4)') или есть плагин, который уже выполняет такую ​​​​функциональность ? - person Bob; 23.12.2009
comment
@Bob, тебе действительно стоит подумать об использовании slice, как ответил @DaveWard. это намного более читабельно и будет работать так, как вы ожидаете. Кроме того, вы не получаете никакого прироста производительности, делая вещи таким образом, он по-прежнему находит все table tr, а затем фильтрует этот список. - person TM.; 23.12.2009
comment
Я согласен, что лучшим решением здесь определенно будет срез, я просто уточнял рассматриваемый код. Нарезка, безусловно, лучший способ получить диапазон. Селекторы фильтров намного медленнее, чем встроенные функции массива. - person Alex Sexton; 24.12.2009

Как насчет $('table tr').slice(2, 4)

Поскольку массивы JavaScript имеют индекс 0, это даст вам третью и четвертую строку таблицы. Slice по-прежнему будет возвращать обернутый (под) набор jQuery, так что это тот же конечный результат.

person Dave Ward    schedule 23.12.2009
comment
Да, но я хочу, чтобы селектор искал только указанные строки. С помощью этого метода jQuery сначала извлекает все строки таблицы, а затем отфильтровывает ненужные таблицы. - person Bob; 23.12.2009
comment
@Bob, это происходит, даже если вы используете версию селектора - person TM.; 23.12.2009
comment
О, это разочаровывает. Я предположил, что внутренне jQuery будет пропускать строки, которые меньше заданного индекса, или останавливаться, когда строки больше заданного индекса, когда вы используете соответствующие модификаторы селектора. По крайней мере, таким образом ему не пришлось бы рассматривать все строки таблицы. - person Bob; 23.12.2009
comment
В любом случае не о чем беспокоиться, поскольку эти строки возвращаются из относительно быстрого вызова getElementsByTagName. Я очень предпочитаю использовать slice, потому что этот сложный селектор :gt():lt() представляет собой просто текст и очень хрупкий/нечитаемый. - person Dave Ward; 23.12.2009

Я считаю, что вы поняли это правильно, хотя я полагаю, что jQuery будет считать с 0 в своем индексе элементов.

Так будет ли это gt(1) и lt(4)?

person David Yell    schedule 23.12.2009
comment
Верно, это из нулевого индекса. Виноват. - person Bob; 23.12.2009