Получение события клика из родительского контейнера, кроме определенных потомков - PullRequest
2 голосов
/ 16 февраля 2020

Ожидаемое поведение: Когда я щелкаю по классу .parent, будет отображаться модальное описание элемента, но оно не будет отображаться, если я нажму на .dropdown или любой из его параметров. .

<div class="parent click-for-item-detail">

  <div class="dropdown">                                         
    <a href="#" class="dropdown-toggle " data-toggle="dropdown">Options</a>                                         
    <ul class="dropdown-menu">                                         
      <li><a href="#">option-1</a></li>
      <li><a href="#">option-2</a></li>                                         
    </ul>                                      
  </div>

  <div class="item-image"><img class="click-for-item-detail" src="image.jpg></div>

  <div class="info">
    <a href="#" class="click-for-item-detail">Item title</a>
    <div class="click-for-item-detail"> item subtitle</div>
  </div>

</div>

Пока что:

$(".click-for-item-detail").on("click",function(e){

        // show the modal if the target itself has been clicked
        if(e.target === this) {
            $('#itemDetailModal').modal('toggle');
        }
    });

Я добавил класс click-for-item-detail в каждый элемент, который должен вызывать модальную деталь элемента. Есть ли лучший способ добиться этого?

Ответы [ 3 ]

2 голосов
/ 16 февраля 2020

Это правда, что говорит Фонг, и это работает. Однако теперь представьте, что у вас в родительском элементе много дочерних элементов, соответствующих этому селектору. Используя что-то вроде ниже, вы бы добавили прослушиватель событий к каждому из этих элементов.

$(".info, .item-image").on("click", function(){
  console.log("Trigger");
});

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

Рассмотрим следующий пример:

  <ul class='parent'>
    <li>No</li>
    <li>Click</li>
    <li>Event</li>
  </ul>

$(".parent").on("click",function(e) {
  if(!e.target.classList.contains('parent')) {
     return console.log('no event')
} 
  console.log('fire event')
});

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

Конечно, вы можете выполнять все виды проверок, например, только элементы <li> .

$(".parent").on("click", (e) => e.target.tagName == 'LI' && console.log('fire event'))

Вот этот пример https://codepen.io/bluebrown/pen/xxGVgYd?editors=1111

Я бы порекомендовал выполнить веб-поиск для делегирования событий и всплытия событий.

2 голосов
/ 16 февраля 2020

Вы можете указать некоторые селекторы, чтобы иметь возможность запуска.

Прочитайте следующий пост, чтобы лучше понять.

Прослушиватель событий для нескольких элементов - jQuery

$(".info, .item-image").on("click", function(){
  console.log("Trigger");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="parent click-for-item-detail">

  <div class="dropdown">                                         
    <a href="#" class="dropdown-toggle " data-toggle="dropdown">Options</a>                                         
    <ul class="dropdown-menu">                                         
      <li><a href="#" class="dropdown-menu-item">option-1</a></li>
      <li><a href="#" class="dropdown-menu-item">option-2</a></li>                                         
    </ul>                                      
  </div>

  <div class="item-image"><img class="click-for-item-detail" src="image.jpg"></div>

  <div class="info">
    <a href="#" class="click-for-item-detail">Item title</a>
    <div class="click-for-item-detail"> item subtitle</div>
  </div>

</div>
1 голос
/ 16 февраля 2020

Вы можете использовать селектор :not(), чтобы отфильтровать элемент, на который вы не нажимаете:

$('.parent > :not(.dropdown)').click(function(e){
  alert('modal');
  //show modal
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="parent">

  <div class="dropdown">                                         
    <a href="#" class="dropdown-toggle " data-toggle="dropdown">Options</a>                                         
    <ul class="dropdown-menu">                                         
      <li><a href="#">option-1</a></li>
      <li><a href="#">option-2</a></li>                                         
    </ul>                                      
  </div>

  <div class="item-image"><img src="image.jpg"></div>

  <div class="info">
    <a href="#">Item title</a>
    <div> item subtitle</div>
  </div>

</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...