Вам необходимо обработать событие щелчка на уровне документа. В объекте события у вас есть targetсвойство, самый внутренний элемент DOM, на который был выполнен щелчок. С его помощью вы проверяете себя и подходите к его родителям до элемента документа, если один из них является вашим наблюдаемым элементом.
См. Пример на jsFiddle
document.addEventListener("click", function (e) {
var level = 0;
for (var element = e.target; element; element = element.parentNode) {
if (element.id === 'x') {
document.getElementById("out").innerHTML = (level ? "inner " : "") + "x clicked";
return;
}
level++;
}
document.getElementById("out").innerHTML = "not x clicked";
});
Как всегда, из-за addEventListener / attachEvent это несовместимо с кросс-браузерами, но работает вот так.
Щелкается дочерний элемент, когда не event.target, но один из его родителей является наблюдаемым элементом (я просто считаю уровень для этого). У вас также может быть логическая переменная, если элемент найден или нет, чтобы не возвращать обработчик из предложения for. Мой пример ограничивается тем, что обработчик завершает работу только тогда, когда ничего не совпадает.
Добавляя кроссбраузерность, я обычно делаю это так:
var addEvent = function (element, eventName, fn, useCapture) {
if (element.addEventListener) {
element.addEventListener(eventName, fn, useCapture);
}
else if (element.attachEvent) {
element.attachEvent(eventName, function (e) {
fn.apply(element, arguments);
}, useCapture);
}
};
Это кроссбраузерный код для присоединения прослушивателя / обработчика событий, включая перезапись thisв IE, в качестве элемента, как это делает jQuery для своих обработчиков событий. Есть много аргументов, чтобы иметь в виду некоторые кусочки jQuery;)