2015-02-09 2 views
2

У меня есть div, который может иметь много дочерних элементов. Этот супер-div имеет класс .clickable, а дочерние div также имеют класс .clickable. У меня также есть обработчик события .click для чего-либо с классом .clickable.onclick select child element

Однако каждый раз, когда я нажимаю внутри супер-div, только супер-div получает событие щелчка. Детские divs никогда не нацелены. Как мне обойти это?

html 
<div class="super clickable"> 
<div id="child-1" class="child clickable"></div> 
<div id="child-2" class="child clickable"></div> 
</div> 

js 
$('.clickable').click(function() { 
$(this).css('border', '1px solid red'); 
}); 
+0

Просто догадываюсь, пока я не смогу проверить его, но как насчет $ (this) .find ('. Child'). Css ('border', '1px solid red'); – lharby

+1

Я думаю, что если вам нужно другое поведение, вам нужно будет привязать к другому классу или селектору. Использование clickable на родительском и дочернем языках сбивает с толку. – lharby

ответ

3

Вы можете использовать child selector > для того, чтобы выбрать прямые .clickable элементы внутри .clickable элементов:

$('.clickable > .clickable').click(function() { 
$(this).css('border', '1px solid red'); 
}); 
+0

спасибо, я пробовал это сейчас! –

+0

ответили в течение одной минуты !!! как вы быстро прочитали этот вопрос !!!!!!!!! –

+2

@NaeemShaikh много практика :) –

1

даже если есть хороший ответ на josh, я бы сказал, не используют одни и те же классы, чтобы вызвать разные Мероприятия.

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

почему:

Вы использовали .clickable для обоих родителей и ребенка, так что я предположим, вам потребуется дополнительно связать другое событие для родителя.

Смотреть это:

$('.clickable > .clickable').click(function() { 
$(this).css('border', '1px solid red'); 
}); 

Это будет работать как шарм, но рассмотреть возможность того, что вам требуется, чтобы добавить еще одно событие для родительского DIV себя, и вы делаете что-то вроде

$('.clickable ').click(function() { 
// make some operation on parent 
}); 

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

Таким образом, вы можете сделать что-то подобное, что было бы лучшей практикой

<div class="super"> // removed the clickable class from parent 
<div id="child-1" class="child clickable"></div> 
<div id="child-2" class="child clickable"></div> 
</div> 

js 
$('.clickable').click(function() { 
$(this).css('border', '1px solid red'); 
}); 

Вот это .. и тогда вы будете не испортит ваш код в будущем

Edit:

Теперь, когда вы использовали двойные классы, а как LinkinTED в следующем сообщении: вы можете сделать что-то вроде $(.child.clickable) и $('.super.clickable'), чтобы различать события для родителя и детей, но, честно говоря, это делает ваш класс clickable бесполезным. Таким образом, ключ - это просто избежать вложенности тех же классов, если вы хотите присоединить к ним события.

+0

Я согласен с вами в двойных именованных классах, разные классы яснее и меньше шансов на провал. Но поскольку TS использует два класса для одного элемента, вы также можете использовать '$ ('.super.clickable') 'для родителя и' $ (. child.clickable) 'для детей (обратите внимание, что * не является * пробелом между обоими классами, что означает, что элемент должен иметь оба класса – LinkinTED

+0

, тогда это не имеет смысла использовать класс 'clickable' вообще –

+0

Да, это правда! – LinkinTED

0

Для тех случаев, когда вы не знаете (или не заботятся), которые дети, вы можете попробовать:

$(".super div").click(function() { 
    // do stuff 
}); 

Или, используя метод .children() JQuery в:

$(".super").children().click(function() { 
    // do stuff 
}); 

И если вы должны быть ориентированы на конкретный дочерний элемент:

// targets second child element 
$(".super div").eq(2).click(function() { 
    // do stuff 
}); 

could also do $(".super div:first") or $(".super div:last") 
or even $(".super div:last-child") depending on your needs 

Тогда вы не урожденной d знать, что назвали дети. Вы напрямую обращаетесь к ним напрямую.

+0

У меня есть -2 на мой предложенный ответ? (Http://gyazo.com/a7fce527e867ad07bfe541523e6bacba) Любое просветление о том, почему? –