2013-03-12 12 views
8

Ich habe ein Element in einer Webseite, die auf es mehrere Rückrufe hatWie entferne ich einen bestimmten Ereignisrückruf von einem HTML-Element mit jquery?

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

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

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

Gibt es eine Möglichkeit nur fn2 aus der Liste der Rückrufe von jQuery ausgelöst zu entfernen. Ich weiß, ich könnte ein 'Wenn' innerhalb der Funktion und einige globale Variable hinzufügen, aber das ist nicht das, wonach ich suche.

Antwort

4

Der zweite Parameter in der unbind-Funktion gibt den zu entfernenden Handler an.

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

Arbeitsbeispiel:http://jsfiddle.net/k73Nx/

+1

abhängig, welche Version. Wenn es überhaupt etwas Neues (1.7+) gibt, dann ist diese Antwort nicht gut. Verwenden Sie $ ('# element'). Off ('click'); – Adam

+0

@Adam, 'unbind()' ist weder veraltet noch entfernt (wie zum Beispiel 'live()'). Sie können es immer noch als Äquivalent zu "off()" verwenden. –

+0

@ FrédéricHamidi - vereinbart, jedoch direkt aus den jQuery-Dokumenten selbst: (Ab jQuery 1.7 werden die Methoden .on() und .off() bevorzugt, um Event-Handler an Elementen anzuhängen und zu entfernen.) - klingt wie unbind und Bindung wird bald veraltet sein. Warum nicht die Warnung beachten? – Adam

0

Verwendung .off

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

working fiddle

+1

Dies entfernt einen Event-Handler, der an das body-Element angehängt ist, das Klicks auf #element behandelt - in der Frage fügte das Poster das click-Ereignis dem Element selbst hinzu, so dass dies nicht funktioniert. – Adam

+0

ja .. danke @Adam ... aktualisiert .. :) .. – bipen

+0

Könnten Sie eine Geige bereitstellen? Ich konnte nicht zur Arbeit gehen und ich frage mich, ob es, weil es nicht mit 'on' –

1

Seien Sie vorsichtig mit Ihrer Syntax hier, andere Antworten sind sehr lose mit ihren.

Wenn Sie:

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

Dann müssen Sie verwenden:

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

Sie kann nicht Verwendung

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

oder

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

weil Sie Ihre Veranstaltung ursprünglich an #element, nicht an Dokument oder Körper gebunden haben.

3

Interessant, dass noch niemand Namespaces erwähnt. Gibt es einen Grund dafür?

Wenn Sie Ihr Ereignis anhängen, können Sie es benennen. Anstelle von würden Sie dem Klickereignis einen Namespace hinzufügen. $(elem).on('click.namespaced', fn)

Wenn die Bindung aufgehoben wird, können Sie das exakte Ereignis mithilfe des Namensraums ebenfalls lösen. $(elem).off('click.namespaced')

Dies ist am praktischsten, wenn Sie Ihre Ereignisfunktion inline definieren.

Eine weitere Sache, die Sie tun können, ist Namensraum alle Ereignistypen innerhalb eines namespae mit nur einem einzigen Anruf zu entbinden: $(elem).off('.namespaced')

Verwandte Themen