Musisz obsłużyć zdarzenie kliknięcia na poziomie dokumentu. W obiekcie zdarzenia masz targetwłaściwość, najbardziej wewnętrzny element DOM, który został kliknięty. Dzięki temu sprawdzasz się i podchodzisz do jego elementów nadrzędnych, aż do elementu dokumentu, jeśli jeden z nich jest Twoim obserwowanym elementem.
Zobacz przykład na 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";
});
Jak zawsze, to nie jest kompatybilne z różnymi przeglądarkami z powodu addEventListener / attachEvent, ale działa w ten sposób.
Dziecko jest klikane, gdy nie jest to event.target, ale jeden z jego rodziców jest obserwowanym elementem (po prostu liczę dla tego poziom). Możesz również mieć zmienną boolowską, jeśli element zostanie znaleziony lub nie, aby nie zwracać procedury obsługi z klauzuli for. Mój przykład ogranicza się do tego, że program obsługi kończy pracę tylko wtedy, gdy nic nie pasuje.
Dodając kompatybilność z różnymi przeglądarkami, zwykle robię to w ten sposób:
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);
}
};
Jest to kod kompatybilny z różnymi przeglądarkami do dołączania detektora / obsługi zdarzeń, włącznie z przepisywaniem thisw IE, jako element, tak jak robi to jQuery dla swoich programów obsługi zdarzeń. Istnieje wiele argumentów, aby mieć na uwadze kilka bitów jQuery;)