2012-02-14 11 views
7

Ho scritto un menu a discesa assolutamente posizionato. Sto innescando un evento personalizzato quando questo menu si apre:Come fare il bubble dell'evento jQuery personalizzato su window.document?

ps.DropDown.prototype._onOpenComplete = function() { 
    $(this).trigger('MENU_OPEN', [this]); 
} 

Questa grande opera quando so che istanza di ps.DropDown a bersaglio:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', fn); 

Tuttavia, vorrei per il mio evento personalizzato bolla fino a window.document se l'evento non viene fermato dalla propagazione. Ad esempio:

var dd = new ps.DropDown(); 
$(dd).on('MENU_OPEN', function(event, instance) { 
    // this would stop bubbling to $(window.document) 
    // event.stopPropagation(); 
}); 
$(window.document).on('MENU_OPEN', function(event, instance) { 
    // bubbled! 
}); 

C'è un modo per farlo con jQuery?

EDIT per aggiungere un esempio per analogia

Un clic su un elemento tasto attiverà un evento. Questo evento continuerà a presentare la catena genitore-elemento fino a quando non raggiunge window.document (a meno che la propagazione non venga interrotta da un listener di eventi). Sono interessato a sintetizzare questo comportamento per gli eventi personalizzati in modo tale che se event.stopPropagation() non viene chiamato, esso diventerà bubble a window.document (o $ .event, o qualche altra finestra globale, non importa)

+0

Il tuo codice sembra buono a chiunque si sia iscritto all'evento 'MENU_OPEN' dovrebbe essere attivato con' .trigger ('MENU_OPEN) '. – ShankarSangoli

+1

Sì, ma sto cercando una soluzione che non richieda un riferimento a un'istanza di ps.DropDown. Voglio che l'evento bolla a window.document. – thesmart

risposta

10

Penso che siete in cerca di chiamare $ .event.trigger manualmente:

$.event.trigger('myCustomEvent', someDataObj, someDomElement, false); 

L'ultimo parametro viene utilizzato per il flag "onlyHandlers", falso in questo caso in quanto vogliamo attivare i gestori di elementi e quindi eseguire nuovamente il trigger su ciascun nodo principale. In questo modo è possibile associare "myCustomEvent" a qualsiasi elemento tra la finestra e il nodo in cui è stato generato questo evento.

-1

se ho bisogno di eventi personalizzati a livello globale, senza un riferimento specifico, ho innescare gli eventi sul corpo della pagina

$('body').trigger('MENU_OPEN', [this]); 

Ora è possibile ascoltare l'evento ovunque senza sapere nulla circa la vostra discesa

$('body').on('MENU_OPEN',function(event, dropDown){ 
    // bubbled 
}); 

Mai usato lo window.document come evento bersaglio.

+1

Grazie per aver risposto, ma non sto cercando di evitare di usare $ (window.document). Ad esempio, quando faccio clic su un pulsante, l'evento clic bolle in ogni genitore finché non viene premuto window.document. Un listener su qualsiasi elemento padre può potenzialmente gestire l'evento. Sto cercando di replicare questo per eventi personalizzati. – thesmart

-1

Non è necessario da attivare eventi personalizzati da un elemento DOM:

$(window.document).bind('dropDownHasOpened', function() { 
    console.log($(this)); 
    // 'this' is window.document 
}); 

ps.DropDown.prototype._onOpenComplete = function() { 
    $.event.trigger('dropDownHasOpened'); 
} 
+1

Capisco che non è necessario. Nel mio esempio, non sto attivando su $ (window.document) ma sull'istanza DropDown. Sono interessato a ribollire l'evento da quell'istanza verso l'alto a $ (window.document), in modo simile a come un evento click-button verrà fatto gorgogliare dai suoi genitori a window.document. – thesmart