2012-01-31 10 views
1

Я пишу приложение, и мне нужно вернуть класс элемента, на который я нажал.Извлечь div без родителей при событии click

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

код я использую, чтобы получить имена классов:

$('div').click(function() { 
    console.log($(this).attr("class")); 
}); 

Это образец элементов:

<div class="parent"> 
    <div class="child"> 
     Bla bla bla 
    </div> 
</div> 

После я нажимаю на .child div, он возвращает мне как .child и .parent имена классов.

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

+0

Просто попробуйте 'return false;' функция щелчка, после 'console.log' - это событие останавливается при первом вызове функции. Если вы хотите применить функцию только к div.child, просто измените первую строку на '$ ('div.child') ...' –

+0

С 'JQuery' всегда есть простой способ исправить ситуацию. Спасибо 'JQuery'! – gdoron

ответ

5

Вы должны предотвратить событие от прорывается к родительских элементов, используйте return false;

$('div').click(function (e) { 
    console.log($(this).attr("class")); 
    return false; // or e.stopPropagation(); 

});  

return false из обработчика событий JQuery это фактически то же самое, как вызов как e.preventDefault и e.stopPropagation на прошло jQuery.Event object. ........

Прочитано this отличный ответ для получения дополнительной информации.

С <div> есть теперь разница между e.stopPropagation() и return false, потому что <div> не имеет событие по умолчанию щелчок, как <a> или < button> делать.

+0

Или вам нужно остановитьPropigation –

+0

@ Splash-X в jQuery, возвращающем false, делает это за вас. – Alnitak

+0

@ Splash-X. Я добавил эту опцию, хотя это не имеет значения, потому что 'div' не имеет никакого события по умолчанию' click' ... – gdoron

1

Вам нужно предотвратить щелчок от пузырька до его родителя.

В родном Javascript, который вы бы назвали ev.stopPropagation(), но в обработчиках jQuery вы можете просто return false в обработчике событий и jQuery, а затем остальное.

См. JSFiddle для демонстрации.

0

Вы добавили событие click для всех элементов DIV, но вам нужно только одно.

$('div.child').click(function() { 
    console.log($(this).attr("class")); 
}); 
+0

Он хочет добавить родителя в список, когда был щелкнут родительский (а не дочерний). – gdoron

2

Не привязывайте к все<div> элементы на странице. Это довольно неэффективно.

Вместо этого ...

  • делегации использовать событие с использованием .on(), связывание одного обработчика к body

  • есть тест выбора делегации для 'div'

  • затем получить .className от this что кликнули


$('body').on('click', 'div', function(e) { 
    console.log(this.className); 
    e.stopPropagation(); 
}); 

Итак, теперь у вас есть один обработчик, выполняющий работу для всех элементов <div>.

Если вы используете старую версию jQuery, используйте .delegate() вместо .on().

$('body').delegate('div', 'click', function(e) { 
    console.log(this.className); 
    e.stopPropagation(); 
}); 

EDIT: Обновлено использовать this вместо e.target как предложено @gdoron.

+0

Если селектор делегата является «div», это будет просто «это»? В любом случае, вы уверены, что привязка динамического делегата к «телу» эффективнее, чем привязать событие ко всем div? В это трудно поверить. – gdoron

+0

@gdoron: Если на странице есть много div, которые должны получить один и тот же обработчик, тогда для этого потребуется меньше накладных расходов памяти для привязки только одного. Для каждого клика требуется больше обработки, но события щелчка часто бывают не похожи на события прокрутки или mousemove. Но вы правы, я мог бы просто использовать «это». По какой-то причине я думал, что будут проблемы с вложенными элементами, но кажется, что их нет. –

+0

В любом случае, вы получили мой +1, хотя я думаю, что это ** возможно ** микро-оптимизация ... – gdoron

0

пытаются использовать return false

$('div').click(function() { 
    console.log($(this).attr("class")); 
    return false; 
}); 
+0

http://jsfiddle.net/f8Fbb/ –

0

Вы можете остановить распространение с помощью event.stopPropagation();

$('div').click(function (e) { 
    console.log($(this).attr("class")); 
    e.stopPropagation(); 
}); 
0

Это потому, что вы включили элементы. И функция выполняется дважды. После того, как в .child и один раз в .parent Try,

<div class="parent">BLA BLA</div> 
<div class="child">bla bla bla</div> 

И увидеть разницу.

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