Die Ereignisdelegierung wurde seit langem von jQuery nativ unterstützt. Die Schwierigkeit besteht darin, den entsprechenden Selektor zu erstellen. Ursprünglich wurde delegate
verwendet, aber in jüngerer Zeit sollte die Delegiertenform von on
verwendet werden.
Zweck der Ereignisdelegierung ist das Abhören von Ereignissen in untergeordneten Elementen und das Aufrufen der gebundenen Ereignisbehandlungsroutinen für diese Elemente, als ob sie an das untergeordnete Element statt an das übergeordnete Element gebunden wären. Dies bedeutet, dass anstelle des Bindens von Handlern an jedes -Element im DOM ein Handler an jedes Element in der ursprünglichen Auswahl gebunden wird (document
ist ein einzelnes Element).Dies macht auch für eine einfache Möglichkeit, einen einzelnen Wähler zu verwenden, um einem sich ständig verändernden Satz von Elementen zu binden, als neue Elemente ihre Veranstaltungen zu document
ausbreitet, ob sie bestanden, wenn die anfängliche Ereignishandler gebunden wurde:
$(document).on('click', '*:not(#master, #master *, #slave, #slave *)', function (e) {
//this will reference the clicked element
});
Beachten Sie außerdem, dass ich nicht nur gesagt habe, dass die Elemente nicht #master
oder #slave
sein müssen, sie müssen nicht Kinder von #master
oder #slave
sein.
Das Binden einer Instanz Ihres Klick-Handlers an jedes DOM-Element (mit Ausnahme von zwei) ist für die Leistung sehr schlecht. – jbabey
Der Grund, warum Ihre Version nicht funktioniert, ist, dass Sie testen, ob das 'document' Element nicht 'master' oder 'slave' als ID hat. Dies ist immer wahr (IIRC 'Dokument' kann keine ID haben), so dass der Handler an das' Dokument' gebunden ist und jeder Klick bewirkt, dass 'Slave' ausgeblendet wird. Aufgrund der Ereignisausbreitung wird das 'click'-Ereignis von' #master' auf das 'Dokument' gesprengt, wo es' #slave' versteckt, obwohl '#master' es nur umgeschaltet hat. Sie müssen "event.target" testen, damit dies funktioniert. –