События эффективно наследуются.
Когда к элементу добавляется обработчик событий, этот обработчик событий также влияет на все дочерние элементы, поскольку они находятся внутри элемента.Поэтому вы должны внимательно относиться к событиям.
В вашем случае вы действительно хотите проверить, что нажимается внутри myEvent:
spanVar = document.getElementById("mySpan");
spanVar.addEventListener("click", myEvent, false);
function myEvent(e){
if (e.target === spanVar) // This will make the img non clickable
var obj = e.target;
}
Если вы хотите получить элемент, к которому изначально был прикреплен обработчик кликов, просто используйте this
spanVar = document.getElementById("mySpan");
spanVar.addEventListener("click", myEvent, false);
function myEvent(e){
var obj = this; // This is the object that had the click handler attached
}
Проблема действительно не в пузыре событий.Дело в том, что все дочерние элементы родительского элемента эффективно получают обработчики событий своего родительского элемента.Пузырьки событий вступили бы в игру, если бы к дочернему элементу и родительскому элементу были прикреплены разные обработчики, но вы хотели только запустить обработчик дочернего элемента.
Другое решение - изменить ваш HTML:
<div>
<img src="images/picture.png" alt="Some nice alt text" />
<span id="mySpan">Link text</span>
</div>