2013-10-28 1 views
2

У меня есть таблица, состоящая из строк. Каждая строка имеет идентификатор, родительский атрибут данных и параметр виртуального уровня, хранящийся в data(). Строки верхнего уровня не имеют атрибута parent или level. Мне нужно, чтобы найти последний потомок узла, как напр:Найти последнего ребенка с jquery

<tr id="83" class=""></tr> 
<tr id="91" class="successor" data-parent="83"></tr> 
<tr id="93" class="successor" data-parent="91"></tr> 
<tr id="92" class="successor" data-parent="91"></tr> 
<tr id="94" class="successor" data-parent="92"></tr> 
<tr id="133" class="successor" data-parent="83"></tr> 
<tr id="134" class="successor rowselected" data-parent="83"></tr> 

Это выглядит как enter image description here

Мне нужно найти, если строка 1.1.1.1 является последней для 1.1. Как это сделать? попытался использовать nextAll или prevВсего селектора и отфильтровать его с помощью данных-родительского и уровня ... но не повезло. Благодарю.

ответ

1

Борьба весь день привела меня к следующему решению: найти верхний узел для строки на одном уровне с dr agged row и проверка того, был ли элемент последним до перетаскивания элемента.

function isLastChild(parent, target, dragged) 
{ 
    var top_node = target.prevUntil("tr[data-parent="+parent+"]").andSelf().prev().first(); 
    var child_nodes = top_node.nextUntil("#"+dragged.attr("id")).filter(function(){ return $(this).data("parent") == target.data("parent")}); 

return (child_nodes.last().attr("id")==target.attr("id")); 
} 
0

Ваш пример кода противоречит вашему описанию virtual level option, если у вас действительно есть virtual level option, тогда это должно сработать. Как показано здесь: http://jsfiddle.net/dBT3D/ Я изменил TR на DIVs, поскольку это вызывало проблемы в браузере, не будучи должным образом отформатированным HTML.

HTML:

<div id="83" class=""> 
    <div id="91" class="successor" data-parent="83" data-level="1"> 
     <div id="93" class="successor" data-parent="91" data-level="2"></div> 
     <div id="92" class="successor" data-parent="91" data-level="2"> 
      <div id="94" class="successor" data-parent="92" data-level="3"></div> 
     </div> 
    </div> 
    <div id="133" class="successor" data-parent="83" data-level="1"></div> 
    <div id="134" class="successor rowselected" data-parent="83" data-level="1"></div> 
</div> 

JS:

$(document).ready(function() { 
    deepestEl = { 
     element: null, 
     level: 0 
    }; 
    $('.successor', '#83').each(function (index, el) { 
     console.log(el); 
     if ($(el).data('level') >= deepestEl.level) { 
      deepestEl.element = el; 
      deepestEl.level = $(el).data('level'); 
     } 
    }); 

    console.log(deepestEl); 
}); 

Это вернет deepestEl объект с уровнем и элементом. В этом примере он возвращает {element: div#94.successor, level: 3}

+0

Это верно, но, как я сказал, что строки не вложены в HTML, поэтому селектор $ («Преемник», „#id_row“) дает пустой результирующий набор. –

0

Вы пробовал следующее:

var lastTr = $('#TABLEID tr').last(); 

Это должно найти последний <TR> элемент текущей таблицы (помеченный «TABLEID»)

Для получения дополнительной информации о jQuery.last()here

+0

Все строки находятся в 1 таблице. Вложенность достигается с помощью дополнительных атрибутов, о которых я писал. –

+0

Ах, извините, вам нужно найти последний элемент, связанный с определенным родительским элементом? т. е. вам нужно найти все вспомогательные элементы строки '91', чтобы они вернули 93 и 92. Правильно ли это предположение? – Nunners

+0

Не совсем, строка 1.1.1.1 для ex имеет id 94, родительский элемент 1.1.1.1 - 92, а родительский - 91. Поэтому я хочу знать, является ли строка 1.1.1.1 последней в списке для узла 91. –