Vous devez gérer l'événement de clic au niveau du document. Dans l'objet événement, vous avez un target
l'élément DOM le plus à l'intérieur qui a été cliqué. Avec cela, vous vous vérifiez et remontez ses parents jusqu'à l'élément document, si l'un d'entre eux est l'élément que vous surveillez.
Voir l'exemple sur 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";
});
Comme toujours, cette méthode n'est pas compatible avec tous les navigateurs à cause de addEventListener/attachEvent, mais elle fonctionne comme suit.
Un enfant est cliqué, lorsque non pas event.target, mais un de ses parents est l'élément surveillé (je compte simplement les niveaux pour cela). Vous pouvez également avoir une variable booléenne, si l'élément est trouvé ou non, pour ne pas retourner le gestionnaire à l'intérieur de la clause for. Mon exemple se limite à ce que le gestionnaire ne se termine que lorsque rien ne correspond.
Pour assurer la compatibilité entre navigateurs, je procède généralement de la manière suivante :
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);
}
};
Il s'agit d'un code compatible avec les navigateurs pour attacher un écouteur/un gestionnaire d'événement, y compris la réécriture de this
dans IE, pour être l'élément, comme le fait jQuery pour ses gestionnaires d'événements. Il y a beaucoup d'arguments pour avoir en tête certains éléments de jQuery ;)