Вот простой пример:
function live(eventType, elementId, cb) {
document.addEventListener(eventType, function (event) {
if (event.target.id === elementId) {
cb.call(event.target, event);
}
});
}
live("click", "test", function (event) {
alert(this.id);
});
Основная идея заключается в том, что вы хотите прикрепить обработчик событий к документу и позволить событию всплывать в DOM. Затем проверьте свойство event.target
, чтобы увидеть, соответствует ли оно требуемым критериям (в данном случае это просто id
элемента).
Edit:
@ shabunc обнаружил довольно большую проблему с моим решением - события на дочерних элементах не будут правильно обнаруживаться. Один из способов исправить это - посмотреть на элементы-предки, чтобы увидеть, есть ли у них указанный id
:
function live (eventType, elementId, cb) {
document.addEventListener(eventType, function (event) {
var el = event.target
, found;
while (el && !(found = el.id === elementId)) {
el = el.parentElement;
}
if (found) {
cb.call(el, event);
}
});
}