2012-04-03 13 views
6

Diciamo che abbiamo un sacco di cose da fare. Usiamo $('body').on('click', '.todo', do_stuff) invece di $('.todo').click(do_stuff) quindi assegneremo solo un listener di eventi al DOM.Sono due jQuery uguali su eventi associati due volte?

Tuttavia, sto usando un piccolo MVC. Ogni vista da fare ha questo codice $('body').on('click', '.todo', do_stuff). Quindi, se abbiamo 20 a dos, significa che il corpo ha 20 ascoltatori in allegato o solo uno? spareranno tutti?

+0

È possibile associare più listener di eventi allo stesso elemento e tutti possono attivarsi. – webdevbyjoss

+0

@webdevbyjoss jQuery ... –

+0

Dalla tua domanda sembra che tu stia cercando di capire come costrutto $ ('ddd'). Do() funziona. Forse vale la pena leggerlo qui: http://api.jquery.com/on/ – webdevbyjoss

risposta

5

Si dovrebbe uccidere il precedente gestore di eventi:

<script> 
    $('body').off('click','.todo', do_stuff); 
    $('body').on('click', '.todo', do_stuff); 
</script> 

compresa la funzione di vero e proprio gestore di eventi nella funzione off(), sarà rimuovi solo quel gestore specifico e non tutti gli altri attivati ​​dagli stessi elementi/eventi. Inoltre, evita le funzioni anonime mentre lo fai.

Si consiglia inoltre di abbandonare unbind() e kill(). on()/off() dovrebbe soddisfare tutte le vostre esigenze di gestione degli eventi, compresi futuri vincoli dal vivo e risultati differiti.

+0

btw, io uso il namespace per funzioni anon. 'click.yepdido' – CamelCamelCamel

+0

Allora sei a posto! ;) – keystorm

+0

Potresti anche essere interessato a '.one()', che si libera da solo dopo il primo evento. Diversi allegati '.one()' comporteranno ancora diverse chiamate al gestore, quindi '.off()' è ancora necessario. – keystorm

4

Se esegui quel codice venti volte, finirai con venti gestori di eventi rilegati; e sì, spareranno tutti.

+0

È terribile! – CamelCamelCamel

+0

questa è una caratteristica! usa unbind() per rimuovere i listener di eventi che non ti servono più – webdevbyjoss

2

Significa che body ha 1 listener che ispeziona tutti gli eventi click e controlla la struttura DOM dell'evento target per vedere se conteneva un elemento .todo.

Ci sarà sempre un solo ascoltatore sul corpo, indipendentemente dal numero di elementi .todo disponibili.

Esempio (codice di massima, ignorare gestore pronti, ecc):

<script> 
    $('body').on('click', '.todo', myFunc); 
    // results in 1 handler on the Body, which will be called when each .todo element is clicked 
</script> 

<body> 
    <div class="todo">Foo</div> 
    <div class="todo">Bar</div> 
    <div class="todo">Baz</div> 
</body> 
+0

um, c'è una risposta contraddittoria, quindi un violino o fonte sarà buona – CamelCamelCamel

+0

yip http://jsfiddle.net/kSAqM/ – CamelCamelCamel

Problemi correlati