В настоящее время я использую jQuery, чтобы сделать div интерактивным, и в этом div также есть якоря. Проблема, с которой я сталкиваюсь, состоит в том, что, когда я нажимаю на привязку, оба события щелчка запускаются (для div и привязки). Как предотвратить запуск события div onclick при нажатии на ссылку?
Вот сломанный код:
JavaScript
var url = $("#clickable a").attr("href");
$("#clickable").click(function() {
window.location = url;
return true;
})
HTML
<div id="clickable">
<!-- Other content. -->
<a href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
источник
if( e.target !== this) return;
в родительском объекте лучше, чемe.stopPropagation()
в дочернем, поскольку вы никогда не знаете, присоединяет ли кто-либо другой обработчик к дочерним элементам, или если библиотека должна прикрепить обработчик к дочернему элементу (и вы не хотите связываться с кодом библиотеки). Это лучшее разделение проблем.if( e.target !== this) return;
флажка в родительском элементе означает, что если щелкнуть любой другой дочерний элемент этого родительского объекта, у которого нет собственных обработчиков onClick, то ничего не произойдет. Так что это бесполезно для ситуации, когда у вас есть, например, интерактивный родительский div.e.stopPropagation()
работает нормально однако.Используйте метод stopPropagation , см. Пример:
Как сказал JQuery Docs:
Имейте в виду, что это не мешает другим слушателям обрабатывать это событие (например, более одного обработчика щелчка для кнопки), если это нежелательный эффект, вы должны использовать
stopImmediatePropagation
вместо этого.источник
Здесь мое решение для всех, кто ищет не jQuery-код (чистый javascript)
Ваш код не будет выполнен, если нажать на потомков родителей
источник
window.event
, что не одобряет MDN: developer.mozilla.org/en-US/docs/Web/API/Window/event . Если вы можете сэкономить время, я был бы признателен, если бы вы могли прокомментировать, почему вы использовалиwindow.event
(возможно, это проблема, существовавшая в 2015 году, или я не смог понять причину).Вы также можете попробовать это
источник
Если вы не собираетесь взаимодействовать с внутренним элементом (ами) в любом случае, тогда вам может пригодиться решение CSS.
Просто установите внутренний элемент / ы в
pointer-events: none
в твоем случае:
или предназначаться для всех внутренних элементов вообще:
Этот простой хак сэкономил мне много времени при разработке с ReactJS
Поддержка браузера может быть найдена здесь: http://caniuse.com/#feat=pointer-events
источник
Если у вас есть несколько элементов в интерактивном div, вы должны сделать это:
источник
Использование
return false;
илиe.stopPropogation();
не позволит выполнить следующий код. Это остановит поток в этой самой точке.источник
Пишу, если кому-то нужно (работал на меня):
Из этого решения.
источник
Встроенная альтернатива:
источник
Вот пример использования Angular 2+
Например, если вы хотите закрыть модальный компонент, если пользователь щелкает за его пределами:
источник
Вам нужно, чтобы событие не достигло (не доходило до) родителя (div). Смотрите часть о пузырях здесь , и jQuery-специфическую информацию об API здесь .
источник
источник
Чтобы указать некоторый подэлемент как неприкасаемый, напишите иерархию css, как в примере ниже.
В этом примере я прекращаю распространение на любые элементы (*) внутри td внутри tr внутри таблицы с классом ".subtable"
источник
ignoreParent () - это чистое решение JavaScript.
Он работает в качестве промежуточного слоя, который сравнивает координаты щелчка мыши с координатами дочернего элемента / элементов. Два простых шага реализации:
1. Поместите код ignoreParent () на свою страницу.
2. Вместо исходного родительского onclick = "parentEvent ();" , записывать:
Вы можете передавать идентификаторы любого количества дочерних элементов в функцию и исключать другие.
Если вы нажали на один из дочерних элементов, родительское событие не сработает. Если вы щелкнули по родительскому элементу, но не по дочернему элементу [предоставляется в качестве аргументов], родительское событие вызывается.
код ignoreParent () на Github
источник
Если это во встроенном контексте, в HTML попробуйте это:
источник
В случае, если у кого-то возникла эта проблема с использованием React, я так решил ее.
СКС:
Визуализация компонента ():
Благодаря добавлению функции onClick для дочерних модальных (content div) событий щелчка мыши предотвращается достижение функции closeLogin родительского элемента.
Это помогло мне, и я смог создать модальный эффект с двумя простыми делами.
источник
добавить
a
следующее:или
return false;
из обработчика кликов для#clickable
:источник
Все решения сложны и из jscript. Вот самая простая версия:
источник
источник