2013-03-12 17 views
8

Ho un elemento in una pagina Web che ha diverse callback su di essoCome rimuovo un callback di un evento specifico da un elemento HTML con jquery?

// First callback 
$("#element").click(fn1); 

// Second callback 
$("#element").click(fn2); 

// Definitions 
function fn1(){console.log("1");} 
function fn2(){console.log("2");} 

Esiste un modo per rimuovere solo fn2 dalla lista dei callback innescati da jQuery. So che potrei aggiungere un "se" all'interno della funzione e qualche variabile globale, ma non è quello che sto cercando.

risposta

4

Il secondo parametro nella funzione unbind specifica il gestore da non vincolare.

$("#element").unbind("click", fn2); 

Esempio di lavoro:http://jsfiddle.net/k73Nx/

+1

Dipende quale versione. Se c'è qualcosa di nuovo (1.7+), allora questa risposta non è buona. Usa $ ('# elemento'). Off ('click'); – Adam

+0

@Adam, 'unbind()' non è né deprecato né rimosso (come 'live()' è per esempio). Puoi ancora usarlo come equivalente a 'off()'. –

+0

@ FrédéricHamidi - d'accordo, comunque direttamente dai documenti jQuery stessi: (A partire da jQuery 1.7, i metodi .on() e .off() sono preferiti per collegare e rimuovere i gestori di eventi sugli elementi.) - fa sembrare unbind e il binding verrà deprecato abbastanza presto. Perché non prestare attenzione all'avvertimento? – Adam

0

uso .OFF

$("#element").off("click",fn2); 

working fiddle

+1

Questo rimuove un gestore di eventi collegato all'elemento body che gestisce i clic su #element: nella domanda, il poster ha aggiunto l'evento click all'elemento stesso, quindi questo non funzionerà. – Adam

+0

sì .. grazie @Adam ... aggiornato .. :) .. – bipen

+0

Potresti fornire un violino? Non potrei andare al lavoro e mi chiedo se è perché non è stato associato a 'on' –

1

Fai attenzione con la tua sintassi qui, altre risposte sono molto sciolte con le loro.

se si utilizza:

$('#element').on('click',function() { 
//callback code 
}); 

Quindi è necessario utilizzare:

$('#element').off('click'); 

È non può uso

$('body').off('click','#element',function() { }); 

o

$(document).off('click','#element',function() { }); 

perché originariamente hai associato il tuo evento a #element, non a documento o corpo.

3

Interessante che nessuno ha ancora nominato spazi dei nomi. C'è una ragione per questo?

Quando si allega l'evento, è possibile assegnare uno spazio ai nomi. Invece di $(elem).on('click', fn), devi aggiungere uno spazio dei nomi all'evento click. $(elem).on('click.namespaced', fn)

Quando non è collegato, è possibile separare l'evento esatto, utilizzando anche lo spazio dei nomi. $(elem).off('click.namespaced')

Questo è più pratico quando si definisce la funzione di evento in linea.

Una cosa si può fare con gli spazi dei nomi è quello di svincolare tutti i tipi di eventi all'interno di un namespae con solo una singola chiamata: $(elem).off('.namespaced')

Problemi correlati