скажем, у меня есть div, вложенный в другой div, и у меня есть событие mousedown, чтобы вызвать предупреждение при нажатии на любой из div. Естественно, предупреждение отображается дважды одним щелчком мыши, поскольку элементы div вложены друг в друга. Как я могу предотвратить это, чтобы предупредить только один раз?
jquery - предотвратить наращивание mousedown с перекрывающимися элементами
Ответы (3)
Вы можете остановить распространение кликов вложенных div, что означает, что они не будут всплывать и запускать обработчик кликов, прикрепленный к родительским div, например:
// attach to all divs
$("div").mousedown(function() {
// do stuff
});
// stop propagation for nested divs
$("div div").mousedown(function(e) {
e.stopPropagation()
});
См. http://api.jquery.com/event.stopPropagation/.
Когда два элемента div вложены друг в друга, мы имеем иерархию элементов HTML. Что-то типа:
body
firstDiv
secondDiv
в котором secondDiv
встроен в firstDiv
, который, в свою очередь, встроен в body
. Теперь всякий раз, когда вы нажимаете на secondDiv, также нажимается firstDiv и тело. Итак, если вы создадите 3 обработчика событий для этих 3 элементов (скажем, покажите 3 предупреждения), вы получите 3 предупреждающих сообщения. Это явление называется пузырьком, потому что если представить, что эти элементы представляют собой слои воды (с дочерними элементами, лежащими глубже), и считать событие (например, щелчок) пузырем, когда вы освобождаете пузырь на нижних слоях, он поднимается к верхним слоям, пока не доберется до поверхности (элемент HTML или даже выше, объект документа и объект окна, который является корневым объектом).
с jQuery вы можете использовать функцию e.stopPropagation() для отмены всплытия. В чистом JavaScript вы используете return false;
, чтобы остановить всплытие.
Почему бы вам просто не добавить обработчик события в родительский div only, тогда он всегда будет срабатывать только один раз.
Ознакомьтесь с jsFiddle: http://jsfiddle.net/aPMB3/