2012-03-20 14 views
6

una versión simplificada de lo que estoy tratando de hacer es como sigue:jQuery escuchar a nivel mundial para eventos personalizado

var indication = $('#some-div'); 
indication.bind('custom-event', function() { ... } 


// ... later on! 

function OtherThing() { 
    $(this).trigger('custom-event'); 
} 

me gustaría indication.bind('custom-event') para recibir el gatillo de function OtherThing sin la necesidad de conocer dos explícitamente acerca El uno al otro. es posible? Mi única solución hasta ahora es unir tanto al oyente como al evento al cuerpo ... esto parece descuidado, ¿hay alguna manera mejor?

+0

Lo ¿Quiere decir "sin que los dos tengan que saber explícitamente sobre el otro"? –

+0

@RobW: no estoy seguro de cómo explicarlo más, aparte de leer el código ... Sé que puedo cambiar '$ (this) .trigger' en' $ ('# some-div) .trigger' y hacer que funcione pero eso derrota el propósito. Como dije, mi solución actual es unir tanto al oyente como a los emisores a '$ ('cuerpo')' – Will

Respuesta

18

En JavaScripts, los eventos activados en cada Elemento HTML se propagan a sus padres, por lo tanto, para resolver su problema y hacer que cualquier elemento sea capaz de manejar el evento personalizado sin hacer algo incorrecto como $('*').bind('custom-event') es vincular al oyente a un padre común para todos los elementos, los bodyhtml o elementos:]

por lo tanto, sólo es necesario para unirse al evento para bodyhtml o elemento. Luego, cuando cualquier elemento, dentro del elemento padre elegido, active el evento personalizado, se propagará a este elemento padre.

Y luego, en el controlador de eventos, se puede acceder al elemento que ha disparado el evento accediendo target atributo para el objeto de evento: event.target

Por lo tanto, el código debe ser:

$('body').bind('custom-event', function(e){ 
    var $element = e.target; 
}); 

$('#anyElement').trigger('custom-event'); 
+3

Será mejor que vincule el evento a 'documento' en lugar de a' 'cuerpo''. Además, esto no funcionará si el elemento no es parte del documento (por ejemplo, no inyectado/iframe). –

+0

Correcto, @RobW. Si el elemento no forma parte del mismo documento del elemento principal, el evento no se propagará a él. –

+1

Gracias por esta gran respuesta, me ayudó también. – carousel

Cuestiones relacionadas