Hallo,
kann mir Jemand sagen was "besser" ist?
Nichts davon ist per se besser. Die Varianten leisten unterschiedliches, es kommt also auf den Anwendungsfall an.
$(document).on('click', 'ul li a', function() {
// mach was
});$(body).on('click', 'ul li a', function() {
// mach was
});
body gibt es nicht als globale Variable. Du meinst wohl $('body') oder $(document.body).
Ob du click-Ereignisse bei document (oberster Document-Knoten), document.documentElement (html-Element) document.body (body-Element) abhörst, ist egal. Durch das Bubbling erreichen click-Ereignisse alle diese Knoten. Beispielhafter DOM-Baum:
#document (document)
└─ html (document.documentElement)
└─ body (document.body)
└─ ul
└─ li
└─ a
Üblich ist, Event-Handler beim obersten Document-Knoten zu registrieren, wenn eine dokumentweite Überwachung erwünscht ist. $(document) ist verständlich und einfach zu schreiben im Vergleich zu $('html'), $(document.documentElement), $('body') oder $(document.body).
> ~~~javascript
$('ul li').on('click', 'a', function() {
> // mach was
> });
>
> $('ul li a').click({
> // mach was
> });
Letzte Variante funktioniert ja nicht wenn ich z.B. durch append ein <li> hinzufüge.
Damit hast du den gravierenden Unterschied schon gefunden. Event-Delegation ist immer sinnvoll, wenn später noch Elemente ins DOM eingefügt werden, auf die ein Kriterium zutrifft (bei jQuery durch einen Selektor ausgedrückt). Man sollte sich fragen:
- Welche Elemente existieren im DOM zum Zeitpunkt des Registrieren der Event-Handler?
- Welche Elemente werden später ggf. existieren?
Wenn das Szenario ist, dass li-Elemente hinzugefügt werden, aber das ul-Element bestehen bleibt, so würde ich folgendes verwenden:
$('#liste').on('click', 'li', function() { … });
Ist es generell besser immer so nah wie möglich am Element zu sein (So wie in Variante 3)?
Nein, das kann man so nicht sagen. Das Zielelement kann ein li-, ein a- oder z.B. ein darin verschachteltes span-Element sein – das ist meistens irrelevant. Wichtig ist, dass das Ereignis durch Bubbling behandelt und korrekt einem Listeneintrag zugeordnet werden kann.
Mathias