2015-01-18 3 views
41

У меня есть элемент <div>, у которого есть еще один элемент <div> в качестве его дочернего элемента.ng-click на родительских щелчках через дочерние объекты

Я добавил директиву ng-click родительскому объекту и ожидал, что он не будет запущен при нажатии на дочерний элемент. Однако это так.

<div class="outer" ng-click="toggle()"> 
    <div class="inner">You can click through me</div> 
</div> 

Почему это делается, и как я могу избежать этого?

Вот JSFiddle демонстрирует проблему

ответ

76

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

<div class="outer" ng-click="toggle()"> 
    <div class="inner" ng-click="$event.stopPropagation()">You can click through me</div> 
</div> 

При нажатии дочернего элемента его событие запускается. Но это не останавливается на достигнутом. Сначала запускается событие click дочернего элемента, затем запускается событие щелчка родительского элемента и так далее. Это называется распространением событий. Чтобы остановить распространение событий (запуск событий щелчка родителей), вы должны использовать вышеуказанную функцию, stopPropagation.


Working example

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

+0

как можно '.outer' ДИВ кликабельна, если нет ничего текста непосредственно insde что. –

+0

И e.stopPropagation() должен использоваться в родительском div не в дочернем div, так что дочерний div не может быть назначен событие click .... –

+0

Верно, я настрою свой ответ и добавлю рабочий пример – itd

0

Если вы хотите установить разные функции для родителя и дочернего элемента, вы можете отправить $ event в качестве параметра для дочерней функции и остановить его внутри. Как это:

<div class="outer" ng-click="onParentClick()"> 
    <div class="inner" ng-click="onChildClick($event)">You can click through me</div> 
</div> 

и в контроллере:

function onChildClick(event){ 
    event.stopPropagation(); 
    //do stuff here... 
} 
function onParentClick(){ 
    //do stuff here.. 
} 
Смежные вопросы