Sie müssen das Klickereignis auf Dokumentebene behandeln. Im Ereignisobjekt haben Sie eine targetEigenschaft, das innerste DOM-Element, auf das geklickt wurde. Damit überprüfen Sie sich selbst und gehen die Eltern bis zum Dokumentelement hoch, wenn eines davon Ihr überwachtes Element ist.
Siehe das Beispiel auf 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";
});
Wie immer ist dies aufgrund von addEventListener / attachEvent nicht Cross-Bad-Browser-kompatibel, aber es funktioniert so.
Ein Kind wird angeklickt, wenn es nicht event.target ist, aber eines seiner Eltern ist das beobachtete Element (ich zähle einfach die Stufe dafür). Sie können auch eine boolesche Variable haben, wenn das Element gefunden wird oder nicht, um den Handler nicht aus der for-Klausel zurückzugeben. Mein Beispiel beschränkt sich darauf, dass der Handler nur dann beendet wird, wenn nichts übereinstimmt.
Wenn ich die Cross-Browser-Kompatibilität hinzufüge, mache ich das normalerweise so:
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);
}
};
Dies ist browserübergreifender kompatibler Code zum Anhängen eines Ereignis-Listeners / -Handlers, einschließlich des Umschreibens thisim IE, als Element, wie dies jQuery für seine Ereignishandler tut. Es gibt viele Argumente, um ein bisschen jQuery im Auge zu behalten;)