Учитывая таблицу:
<table border>
<tr>
<th rowspan=3>H1</th>
<td>1</td>
</tr>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<th rowspan=3>H2</th>
<td>21</td>
</tr>
<tr>
<td>22</td>
</tr>
<tr>
<td>23</td>
</tr>
</table>
Предположим, что у нас есть событие на "td", которое должно искать ближайший "th" (пересекая DOM вверх). Например, при нажатии на 1, 2 или 3, он должен возвращать H1. При нажатии на 21,22,23 он должен вернуть H2.
Есть идеи?
Как насчет этого:
$('td').click(function () {
if ($(this).parent().has('th').length > 0) {
$(this).parent().find('th').css('background', 'red');
//alert('first row!');
} else {
$(this).parent().prevAll('tr').has('th').first().find('th').css('background', 'red');
}
})
В основном я сначала проверяю, выбрана ли первая строка, строка, содержащая <th>
.
Если это не так, я буду искать все предыдущие элементы <tr>
(Перейти к началу структуры DOM). Всякий раз, когда у кого есть элемент <th>
он будет в запросе .prevAll
. Я выберу первый, который был выбран.
Теперь мы выбираем <th>
в выбранном <tr>
.
Надеюсь, это не "сверху" ^^
Вы можете использовать
$(this).parent().prevAll('tr').add($(this).parent()).has('th').last().find('th');
Плагин может быть излишним, но это работает:
$.fn.myTh = function () {
var $elem = this.first();
var $th = $elem.siblings('th');
if ($th.length)
return $th;
else
return $elem.parent('tr').prev('tr').children('th');
};
Структура HTML, которую вы проверяете, может охватывать разные ветки, поэтому вам нужно написать рекурсивную функцию для проверки элементов sibling th
а если их нет, то дети из ближайших родственников tr
элементов. Попробуй это:
$('td').click(function() {
alert(findTh($(this).closest('tr')));
});
function findTh($row) {
var $th = $('th', $row),
$prevRow = $row.prev('tr');
if ($th.length) {
return $th.text();
}
else if ($prevRow.length) {
return findTh($prevRow);
}
else {
return '';
}
}
Выберите родных и родственных элементов, затем используйте ближайший.
$(this).siblings().addBack().closest("th");
если один из братьев и сестер соответствует селектору, он выбирает первый, иначе он пересекает дерево и возвращает первое, что соответствует.