Подтвердить что ты не робот

Как получить событие click ONLY только для родительского DIV, а не для детей?

У меня есть DIV с классом foobar и несколько DIV внутри этого DIV, которые являются неклассифицированными, но я полагаю, что они наследуют класс foobar:

$('.foobar').on('click', function() { /*...do stuff...*/ });

Я хочу, чтобы это срабатывало только при нажатии в DIV, но не на дочерних DIV.

4b9b3361

Ответ 1

Если e.target - это тот же самый элемент, что и this, вы не нажали на потомка.

$('.foobar').on('click', function(e) {
  if (e.target !== this)
    return;
  
  alert( 'clicked the foobar' );
});
.foobar {
  padding: 20px; background: yellow;
}
span {
  background: blue; color: white; padding: 8px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='foobar'> .foobar (alert) 
  <span>child (no alert)</span>
</div>

Ответ 2

Есть другой способ, который работает, если вы не возражаете против ориентации только на новые браузеры. Просто добавьте CSS

pointer-events: none;

для любых дочерних элементов div, которые вы хотите захватить. Здесь таблицы поддержки

http://caniuse.com/#feat=pointer-events

Ответ 3

Вы можете использовать пузырь в свою пользу:

$('.foobar').on('click', function(e) {
    // do your thing.
}).on('click', 'div', function(e) {
    // clicked on descendant div
    e.stopPropagation();
});

Ответ 4

//bind `click` event handler to the `.foobar` element(s) to do work,
//then find the children of all the `.foobar` element(s)
//and bind a `click` event handler to them that stops the propagation of the event
$('.foobar').on('click', function () { ... }).children().on('click', function (event) {
    event.stopPropagation();
    //you can also use `return false;` which is the same as `event.preventDefault()` and `event.stopPropagation()` all in one (in a jQuery event handler)
});

Это остановит распространение (пузыри) события click на любом из дочерних элементов (ов) элемента (ов) .foobar, чтобы событие не достигло элемента (ов) .foobar для запуска их обработчика событий.

Вот демо: http://jsfiddle.net/bQQJP/

Ответ 5

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

if(e.target !== e.currentTarget) return;

Ответ 6

$(".advanced ul li").live('click',function(e){
    if(e.target != this) return;
    //code
    // this code will execute only when you click to li and not to a child
})

Ответ 7

У меня была такая же проблема, и я придумал это решение (на основе других ответов)

 $( ".newsletter_background" ).click(function(e) {
    if (e.target == this) {
        $(".newsletter_background").hide();
    } 
});

В основном, он говорит, что если целью является div, тогда запустите код, иначе ничего не делайте (не скрывайте)

Ответ 8

Мой случай похож, но это случай, когда у вас мало foobar -s, и вы хотите закрыть только один - за один клик:

Найти родительский корпус

$(".foobar-close-button-class").on("click", function () {
    $(this).parents('.foobar').fadeOut( 100 );
    // 'this' - means that you finding some parent class from '.foobar-close-button-class'
    // '.parents' -means that you finding parent class with name '.foobar'
});

Найти случай ребенка

$(".foobar-close-button-class").on("click", function () {
    $(this).child('.foobar-close-button-child-class').fadeOut( 100 );
    // 'this' - means that you finding some child class from '.foobar-close-button-class'
    // '.child' -means that you finding child class with name '.foobar-close-button-child-class'
});

Ответ 9

Вы можете использовать event.currentTarget. Он будет делать событие click только elemnt, который получил событие.

target = e => {
    console.log(e.currentTarget);
  };
<ul onClick={target} className="folder">
      <li>
        <p>
          <i className="fas fa-folder" />
        </p>
      </li>
    </ul>

Ответ 10

Если вы не можете использовать pointer-events: none; и ориентируетесь на современные браузеры, вы можете использовать composedPath для обнаружения прямого щелчка по объекту, например, так:

element.addEventListener("click", function (ev) {
    if (ev.composedPath()[0] === this) {
        // your code here ...
    }
})

Вы можете узнать больше о compedath здесь:https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath