Обработчики событий в родительском и дочернем подразделениях

#javascript #event-handling #dom-events #event-bubbling

#javascript #обработка событий #dom-события #пузырящееся событие

Вопрос:

Вот мой HTML-файл

 <div class="a">
    <div class="b">

    </div>
</div>
<script>
    document.querySelector('.a').onclick = ()=>{
        document.querySelector('.a').style.backgroundColor ='black'
    }
    document.querySelector('.b').onclick = ()=>{
        document.querySelector('.b').style.backgroundColor ='violet'
    }

</script>
  

Когда я нажимаю на div с классом ‘b’, также вызывается обработчик событий в div с классом ‘a’. Я хочу, чтобы вызывался только div с обработчиком событий класса ‘b’. Кто-нибудь может помочь в этом?

Ответ №1:

Это Event Bubbling , что означает, что каждое событие запускается не только на целевом элементе, но и на его элементах-предках.

Чтобы предотвратить такое поведение, вы можете использовать Event.stopPropagation() , чтобы остановить распространение события на элементы-предки целевого элемента.

 document.querySelector('.a').onclick = () => {
  document.querySelector('.a').style.backgroundColor = 'black'
}

document.querySelector('.b').onclick = (event) => {
  event.stopPropagation();
  document.querySelector('.b').style.backgroundColor = 'violet'
}  
 div { width: 100px; height: 100px; }
.a { padding: 40px; background: red; }
.b { background: blue; }  
 <div class="a">
  a
  <div class="b">b</div>
</div>  

Ответ №2:

В JS есть концепция, называемая обработкой событий. По умолчанию любое событие, происходящее в определенном элементе, будет передано родительскому элементу и его родительскому элементу и так далее, пока событие не достигнет документа.

Чтобы остановить это поведение, Event.stopPropagation придет на помощь и прекратит передачу события родительскому элементу.

Таким образом, в этом случае вызов e.stopPropagation в onclick обработчике div с классом b , т. Е. внутреннего div, остановит распространение события на родительский div.

 document.querySelector('.a').onclick = (e) => {
  document.querySelector('.a').style.backgroundColor = 'black'
}
document.querySelector('.b').onclick = (e) => {
  e.stopPropagation();
  document.querySelector('.b').style.backgroundColor = 'violet'
}  
 .b {
  width: 50%;
}  
 <div class="a">
  <div class="b">
  Dummy
  </div>
</div>  

Ответ №3:

Попробуйте это :

  document.querySelector('.a').onclick = ()=>{
        document.querySelector('.a').style.backgroundColor ='black'
    }
    document.querySelector('.b').onclick = (e) => {
        e.stopImmediatePropagation();
        document.querySelector('.b').style.backgroundColor ='violet'
    }  
 <div class="a">a
    <br/>
    <div class="b">
        Click here!
    </div>
</div>