2012-03-20 9 views
6

uproszczoną wersją co usiłuję zrobić to w następujący sposób:jQuery słuchać globalnie dla niestandardowego zdarzenia

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


// ... later on! 

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

Chciałbym indication.bind('custom-event') otrzymywać spust z function OtherThing bez dwóch konieczności jawnie wiedzieć wzajemnie. czy to możliwe? Jedynym moim dotychczasowym rozwiązaniem jest związanie zarówno słuchacza, jak i wydarzenia z ciałem ... wydaje się to niechlujne - czy istnieje lepszy sposób?

+0

Co masz na myśli "bez dwóch jednoznacznie o sobie nawzajem"? –

+0

@RobW - nie wiem, jak to wyjaśnić dalej, inne niż czytanie kodu ... Wiem, że mogę zmienić '$ (this) .trigger' na' $ ('# some-div) .trigger' i sprawić by działało ale to pokonuje cel. Jak stwierdziłem, moje obecne rozwiązanie polega na związaniu zarówno słuchacza, jak i emiterów z '$ ('body')' – Will

Odpowiedz

18

W JavaScriptach zdarzenia wyzwalane na każdym elemencie HTML są propagowane do ich rodziców, więc aby rozwiązać problem i sprawić, by którykolwiek element był w stanie obsłużyć zdarzenie niestandardowe bez popełnienia czegoś nieprawidłowego, jak $('*').bind('custom-event'), należy powiązać słuchacza z wspólny element nadrzędny dla wszystkich elementów, elementy body lub html:]

Konieczne jest tylko powiązanie zdarzenia z elementem body lub html. Następnie, gdy dowolny element w wybranym elemencie nadrzędnym wyzwoli zdarzenie niestandardowe, zostanie on propagowany do tego elementu nadrzędnego.

a następnie w obsługi zdarzeń, można uzyskać dostęp do elementu, który wywołał zdarzenie dostępu atrybut target dla obiektu zdarzenia: event.target

więc kod powinien być:

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

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

. Lepiej powiązać zdarzenie z "document" zamiast "body". Ponadto nie będzie działać, jeśli element nie jest częścią dokumentu (np. Nie wstrzyknięty/element iframe). –

+0

Zgadza się, @RobW. Jeśli element nie jest częścią tego samego dokumentu elementu nadrzędnego, zdarzenie nie będzie do niego propagowane. –

+1

Dzięki za tę wspaniałą odpowiedź - pomógł mi również. – carousel

Powiązane problemy