Вы имеете дело с Событием, всплывающим .
По сути, ваш щелчок по дочернему элементу всплывает через всех родителей этого ребенка;если с этими родителями связан обработчик кликов, он будет выполняться.
В псевдокоде: вы можете видеть, какой элемент является вашей текущей целью, и если это не DIV, вы знаете, что вам нужно искать этородительский элемент.
Используя ваш пример, это выглядело бы примерно так (немного упрощенно для вашего примера; в действительности вам нужно что-то гораздо более надежное):
function getActivatedObject(e) {
var obj;
if (!e) {
obj = window.event.srcElement;
} else if (e.srcElement) {
obj = e.srcElement;
} else {
obj = e.target;
}
// Images are direct children of our DIV. If our source element was an img, we should
// fetch its parent
if(obj.tagName.toLowerCase() === "img"){
obj = obj.parentNode;
}
return obj;
}
Примечаниечто это будет работать только для вашего примера;в реальном мире вам, вероятно, потребуется выполнить итерацию по дереву DOM, сравнивая parentNodes
с интересующими вас элементами, пока не найдете то, что ищете.
Большинство библиотек JavaScript аннотацияэто для вас (например, jQuery устанавливает свойство currentTarget
всех отправляемых им событий, которое ссылается на нужный вам элемент, инкапсулируя всю работу по обходу для вас).Облегчает, но это не слишком страшная работа, чтобы написать это самостоятельно, и я бы поспорил против включения накладных расходов всей библиотеки JavaScript, если это все, что вам нужно сделать.:-)
РЕДАКТИРОВАТЬ: полностью уничтожил мое форматирование!D'ой!