Bạn cần xử lý sự kiện nhấp chuột ở cấp độ tài liệu. Trong đối tượng sự kiện, bạn có một thuộc targettính, phần tử DOM bên trong nhất đã được nhấp. Với điều này, bạn tự kiểm tra và đi lên phần tử cha mẹ của nó cho đến phần tử tài liệu, nếu một trong số chúng là phần tử bạn đã xem.
Xem ví dụ trên 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";
});
Như mọi khi, tính năng này không tương thích với nhiều trình duyệt xấu vì addEventListener / attachmentEvent, nhưng nó hoạt động như thế này.
Một đứa trẻ được nhấp vào, khi không phải event.target, nhưng một trong số đó là cha mẹ của nó là phần tử đã theo dõi (tôi chỉ đơn giản là đang đếm cấp độ cho điều này). Bạn cũng có thể có một boolean var, nếu phần tử được tìm thấy hoặc không, để không trả về trình xử lý từ bên trong mệnh đề for. Ví dụ của tôi là giới hạn ở chỗ người xử lý chỉ kết thúc, khi không có gì phù hợp.
Thêm khả năng tương thích giữa các trình duyệt, tôi thường làm như thế này:
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);
}
};
Đây là mã tương thích với nhiều trình duyệt để đính kèm trình xử lý / xử lý sự kiện, viết lại bao gồm thistrong IE, làm phần tử, giống như jQuery làm cho trình xử lý sự kiện của nó. Có rất nhiều đối số để ghi nhớ một số bit jQuery;)