2010-09-30 3 views
29

У меня есть этот HTML-код:.JQuery родителя() ("селектор")

<tr> 
    <td><input type="checkbox" class="chk" /></td> 
    <td><div class="disabled">text to hide 1</div></td> 
    <td><div class="disabled">text to hide 2</div></td> 
</tr> 

Я использую JQuery, чтобы скрыть все class="disabled" элементы:

$("div.disabled").hide() ; 

Я хочу показать инвалидов дивы когда я устанавливаю флажок в той же строке (tr). Я попытался

$("input.chk").click(function(){ 
    $(this).parent().parent().(".disabled").show(); 
}) ; 

, но он не работает.

ответ

65

Использование .closest() и .find(), как это:

$("input.chk").click(function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

Ваш текущий код почти работы, вам нужно .find(), хотя, как это:

$(this).parent().parent().find(".disabled").show(); 

Если у вас есть много строк как это, используйте .delegate(), например:

$("table").delegate("input.chk", "click", function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

.delegate() вместо этого привязывает один обработчик к таблице для всех элементов input.chk, чтобы пузыриться до. Если вы хотите, чтобы включить/выключить, использовать change и .toggle() в дополнение к вышесказанному, как это:

$("table").delegate("input.chk", "change", function(){ 
    $(this).closest('tr').find(".disabled").toggle(this.checked); 
}); 

Таким образом, если флажок установлен, они показывают, если они не скрывают.

+1

.closest() был устаревшим и удален в 1,8 http://api.jquery.com/closest/ (см внизу страницы) Посмотрите на HTTP : //api.jquery.com/parentsUntil/ –

+0

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

2

Практически. Вам просто не хватает слова find, чтобы указать jQuery's .find() method.

$("input.chk").click(function(){ 
    $(this).parent().parent().find(".disabled").show(); 
}) ; 

Или немного короче версия для use .closest().

$("input.chk").click(function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

Вы могли бы также use .parents(), хотя вы хотели бы указать the :first матч в случае, если вы вложенной таблицы.

$("input.chk").click(function(){ 
    $(this).parents('tr:first').find(".disabled").show(); 
}); 
0

Его фактически даже проще, чем это.

$(".disabled").hide(); 
    $(".chk").click(function(){ 
     if($(this).is(":checked")) 
     { 
      $(this).siblings(".disabled").show(); 
     } 
     else 
     { 
      $(this).siblings(".disabled").hide(); 
     } 
    }); 

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

+0

Элементы не являются братьями и сестрами, они находятся в разных ячейках таблицы :) * если бы они были, то короткий метод был бы следующим: '$ (". Chk "). Change (function() {$ (this) .siblings («.disabled»). toggle (this.checked);}); ' –

+0

Я предположил, что они были братьями и сестрами, потому что они были на том же уровне, что и в общем родителе. Я следил за твоей беседой с нуббелем, и ты прав, я делал то же самое с и не

. – Eric

0

И это еще проще:

$(".disabled").hide(); 
$(".chk").click(function() { 
    $(this).siblings(".disabled").toggle(); 
});​ 

:-)

+0

Как я прокомментировал другой ответ (кроме этого не учитывается начальное состояние), элементы '.disabled' не являются братьями и сестрами :) –

+0

Я так и думал и собирался прокомментировать Эрик, но я пробовал: http : //jsfiddle.net/jpQcu/. Кажется, что '$ .siblings()' возвращает элементы, которые находятся на одной глубине дерева. Я думаю, что '$ .nextAll()' это то, что мы имели в виду. – nubbel

+0

@nubbel - '.nextAll()' также * только * для братьев и сестер :) –

3

Да, используя find() и closest(), безусловно, правильный порядок. Существует другой стиль написания того же. Этот фрагмент кода находится здесь.

$("input.chk").click(function() { 
     var th = $(this); 
     $(".disabled", th.parent().parent()).show(); 
}); 
+0

У вас там синтаксическая ошибка, на линии 3 :) –

+0

@Shrikant Sharat Спасибо. Я исправил свой ответ :). – Anji

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