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

JQuery stopPropagation bubble down

У меня есть div со ссылкой внутри него:

<div id="myDiv">
    <a href="#" onclick="location.href='http://www.lol.com'; return false;">Lol</a>
</div>

Щелчок по <div /> должен идти куда-то, но нажатие на дочерний элемент <a /> следует перейти на www.lol.com. Я видел из предыдущих вопросов и сайт jQuery, который .stopPropagation предотвращает пузырение вверх, но как я могу предотвратить пузырь вниз (не так ли здесь здесь?).

4b9b3361

Ответ 1

События только пузырятся. Поэтому обработчик события click для элемента a запускается перед обработчиком события click для div. Если вы хотите описать поведение, вам нужно добавить обработчик события клика к элементу, который останавливает распространение в div.

$("#myDiv a").click( function(event) {
    event.stopPropagation();
} );

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

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

$("#myDiv").click( function( event ) {
    if( !$( event.target ).is( "a" ) )
    {
        // existing event handler
    }
} );

Ответ 2

Проблема заключалась в том, что нажатие на якорь по-прежнему вызывало щелчок в <div>. Это называется "событие пузыря".

На самом деле существует несколько решений:

Проверка в обработчике событий DIV click, был ли фактический целевой элемент привязкой    → jsFiddle

$('#myDiv').click(function (evt) {
    if (evt.target.tagName != "A") {
        alert('123');
    }

    // Also possible if conditions:
    // - evt.target.id != "ancherComplaint"
    // - !$(evt.target).is("#ancherComplaint")
});

$("#ancherComplaint").click(function () {
    alert($(this).attr("id"));
});

Остановка распространения события из прослушивателя кликов привязки → jsFiddle

$("#ancherComplaint").click(function (evt) {
    evt.stopPropagation();
    alert($(this).attr("id"));
});

Как вы могли заметить, я удалил следующую часть селектора из своих примеров:

:not(#ancherComplaint)

Это было необязательно, потому что нет элемента с заголовком class.expandable-panel, который также имеет #ancherComplaint как его идентификатор.

Я предполагаю, что вы хотите подавить событие для привязки. Это не может работать таким образом, потому что оба селектора (ваш и мой) выбирают тот же самый DIV. Селектор не влияет на слушателя при его вызове; он устанавливает только список элементов, к которым должны быть зарегистрированы слушатели. Поскольку этот список в обеих версиях одинаковый, разницы нет.