Есть ли способ предотвратить клик из-за <a>
, вызывающего делегированные обработчики кликов на его родительском элементе, в то же время позволяя поведению <a>
по умолчанию (переход к href
).
Вот пример, который иллюстрирует то, что я спрашиваю.
<div class="top">
<div class="middle">
<a href="google.com" class="link">link</a>
</div>
</div>
И мой JavaScript:
$(".top").delegate(".middle", "click", function(event) {
alert("failure");
});
$(".top").delegate(".link", "click", function(event) {
// ???
});
В этом случае я хочу перейти на google.com при нажатии на ссылку, но НЕ должен видеть alert("failure")
при выходе.
Существует несколько ограничений для решения:
- Все обработчики событий должны быть делегированы с
$(".top")
, поскольку у меня потенциально есть тысячи таких на странице.
- Навигация должна выполняться с использованием поведения браузера по умолчанию, а не
window.location = $(this).attr("href")
или аналогичного
Используя обычную привязку событий, я мог бы сделать e.stopPropagation()
в обработчике кликов для <a>
, но это не сработает из-за характера делегирования. jQuery предоставляет другой метод с именем .stopImmediatePropagation()
, который описывает то, что я хочу (предотвращая другие обработчики на текущем элементе, в данном случае элемент, который содержит делегированные обработчики), но фактически не выполняет этого в этом случае. Это может быть ошибка в .delegate()
, я не уверен.
Возвращение false
из обработчика щелчка <a>
не позволит запустить другой обработчик, но также выполнит .preventDefault()
, поэтому браузер не будет перемещаться. В общем, мне интересно, что return false;
делает, а e.stopImmediatePropagation(); e.preventDefault();
нет. На основании документов они должны быть эквивалентными.
Для демонстрационной версии приведенного выше кода, вот jsFiddle: http://jsfiddle.net/CHn8x/