La delegación de eventos ha sido soportada desde hace mucho por jQuery. La dificultad radica en crear el selector apropiado. Originalmente, se usó delegate
, pero más recientemente se debe usar el formulario delegado de on
.
El propósito de la delegación de eventos es escuchar eventos en elementos secundarios e invocar a los manejadores de eventos enlazados en esos elementos como si hubieran sido vinculados al elemento hijo, en lugar de al padre. Esto significa que en lugar de vincular controladores a cada elemento en el DOM, está vinculando un controlador a cada elemento en la selección inicial (document
es un elemento único).Esto también hace que para una forma sencilla de utilizar un solo selector de unirse a un conjunto siempre cambiante de elementos, como nuevos elementos y se propague a sus eventos a document
si son o no existían cuando el controlador de eventos inicial fue obligado:
$(document).on('click', '*:not(#master, #master *, #slave, #slave *)', function (e) {
//this will reference the clicked element
});
Además, tenga en cuenta que no solo dije que los elementos no deben ser #master
o #slave
, sino no deben ser hijos de #master
o #slave
tampoco.
vinculando una instancia de su manejador de clics a cada elemento DOM (excepto dos) va a ser terrible en el rendimiento. – jbabey
La razón por la cual su versión no funciona es porque está probando si el elemento 'document' no tiene' master' o 'slave' como su ID. Esto siempre es cierto (el 'document' de IIRC no puede tener una ID), por lo que el controlador está vinculado al 'documento' y cada clic hará que se oculte' slave '. Luego, debido a la propagación del evento, el evento 'click' de' # master' saltará al 'document' donde ocultará' # slave', aunque '# master' simplemente lo alteró. Debes probar 'event.target' para que esto funcione. –