2009-03-04 1 views
11
<table> 
    <tr id="parent_1"> 
    <td>Parent 1</td> 
    </tr> 
    <tr class="child"> 
    <td>Child 1</td> 
    </tr> 
    <tr class="child"> 
    <td>Child 2</td> 
    </tr> 
    ... 
    <tr id="parent_2"> 
    <td>Parent2</td> 
    </tr> 
    ... 
</table> 

Как найти число дочерних строк между parent_1 и parent_2 с помощью jQuery?Подсчитайте количество строк таблицы между двумя конкретными строками с помощью jQuery

Edit: К сожалению, не дают понять, что это всего лишь пример, таблица может содержать любое количество родительских строк и любое количество дочерних строк

+0

решения Chatuman является лучшим компромиссом между краткостью и производительностью. – vladr

ответ

16

Это поможет вам, что вы хотите

var childCount = ($('#parent_2').get(0).rowIndex - $('#parent_1').get(0).rowIndex) - 1; 
+3

+1 отлично! но зачем беспокоиться о посредниках? Возьмите API напрямую: document.getElementById ('parent_2'). RowIndex - document.getElementById ('parent_1'). RowIndex - 1; – vladr

+0

Хороший ответ. Плюс, @Vlad прав: jQuery ничего не дает в этом случае. –

+0

+1 Комментарий Влада! Конечно, это предполагает, что между ними нет других строк, которые не являются ни «родительскими», ни «дочерними», что возможно, но вопрос не совсем ясен. – bobince

0

Допуская parent_1 и parent_2 являются начало и концевые ряды соответственно:

$("#parent_1").siblings().size() - 1 
+0

-1 - почему предположение, что # parent_2 - последняя строка? – vladr

+0

Почему это имеет значение, в каком порядке они находятся? – eyelidlessness

2

Первая идея, которая пришла на ум. Я уверен, что есть какой-то сложный способ выбора элементов, о которых идет речь (это означает, что вам просто нужно будет делать $ (селектор) .length), но я не могу думать об одном из моих ног.

var doCount = false; 
var numberOfChildren = 0; 

$('tr').each(function(i){ 
    if($(this).is("#parent_2")) 
     doCount = false; 

    if(count) 
     numberOfChildren++; 

    if($(this).is("#parent_1")) 
     doCount = true; 
}); 
+0

-1 - Плохая производительность; сканирует все строки в таблице, даже если у вас есть 1 миллион, и они будут только рассчитывать на два (которые, как оказалось, находятся в конце таблицы). – vladr

+0

Как часто у вас будет так много строк, которые подсчитывают их убийства представление? Я согласен, что есть лучшие решения, но я бы не стал беспокоиться о O (n) слишком много в этом контексте. –

+0

Ваше душевное состояние отлично поработало для меня, спасибо за пример! – Avien

11

Это:

$('#parent_1 ~ .child:not(#parent_2 ~ *)').size() 

Перевод: сопрягать все элементы класса child, которые являются братьями и сестрами, и прийти после, #parent_1, но не те, которые являются братьями и сестрами и пришли после того, как #parent_2 ,

+0

Вот что я надеялся, что кто-то подумает. Спасибо, что научил меня чему-то! ;) –

+0

@ Vlad: jQuery не использует XPATH. –

+0

Это селектор CSS 3, а не XPath, но ваша точка стоит - это, вероятно, не самое эффективное решение. – Miles

2

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

var rowid1 = 'parent_1'; 
var rowid2 = 'parent_2'; 

var rows = $("#"+rowid1).parent().find('tr'); 
var count = 0; 

for (var i = 0; i < rows.size(); i++) { 
    var el = rows.get(i); 

    // Done counting 
    if (el.id == rowid2) break; 

    if (el.id != rowid1) { 
     ++count; 
    } 
} 

alert("There are " + count + " rows between"); 
+0

Все еще плохо, если огромный стол и parent_1 стола находятся ближе к концу стола! – vladr

2

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

$(document).ready(function() { 
    n = 0; 
    var x = new Array(0,0,0); 

    $("table tr").each(function(i) 
    { 
     if($(this).hasClass("child")) 
     { 
      x[n] += 1; 
     } 
     else 
     { 
      n += 1; 
     } 
    }); 

    for(var y = 0; y < x.length; y++) 
    { 
     alert(x[y]); 
    } 
}); 

EDIT Кстати мой не волнует, сколько родителей есть, он просто будет держать отсчет до тех пор, массив достаточно велик.

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