Oto prosty przykład:
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);
});
Podstawowym założeniem jest to, że chcesz dołączyć obsługi zdarzeń do dokumentu i niech się bańkę zdarzeń DOM. Następnie sprawdź właściwość event.target
, aby sprawdzić, czy pasuje ona do żądanych kryteriów (w tym przypadku tylko element id
).
Edit:
@shabunc odkrył dość duży problem z moim solution-- wydarzeń na elementy podrzędne nie zostaną wykryte poprawnie. Jednym ze sposobów, aby to naprawić jest spojrzenie na elementy przodków aby sprawdzić, czy mają określony 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);
}
});
}
Zawsze można przeczytać źródło jQuery: s. Nie jestem jednak pewny, jak daleko by to wyglądało od natywnego JS, ponieważ jestem pewny, że będzie on w znacznym stopniu zależał od tego punktu (pod względem używania selektorów i czegokolwiek). – Corbin
Tylko jedna uwaga: '.live()' jest przestarzałe przez długi, długi czas. Został zastąpiony przez '.delegate()', który został zastąpiony przez '.on()', więc użyj ostatniego. Co więcej, ostatni pokazuje różnicę między wiązaniem a delegowaniem, więc możesz rzucić okiem. Najważniejsze jest sprawdzenie celu zdarzenia. – Tadeck
Ta moja odpowiedź może pomóc http://stackoverflow.com/a/27373951/1385441 –