Überschreiben Sie alle Veranstaltungen JavaScript gebunden an ein Element mit einem einzigen neuen Ereignis

StackOverflow https://stackoverflow.com/questions/4659032

Frage

Unter der Annahme, dass es eine große Anzahl von Elementen der gesamten Website, die eine unbekannte Anzahl und Art der Ereignisse zu ihnen gebunden.

Wenn ich alle diese Ereignisse mit einem einzigen gebundenen Ereignis müssen außer Kraft zu setzen, und nur das Ereignis ausgelöst wird, was sind einige Empfehlungen?

Ich würde das Ereignis zu einem Click-Ereignishandler verbindlich, und ich bin mit jQuery.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie suchen jQuery#unbind .

alle Event-Handler auf einem Elemente zu entfernen oder eine Reihe von Elementen, gerade tun:

$('.some-selector').unbind();

Um unbind nur klicken Handler Verwendung unbind('click'):

$('.some-selector').unbind('click');

Um alle Klick-Handler und sofort binden Sie Ihre eigenen Handler danach entbinden, können Sie etwas tun:

$('.some-selector').unbind('click').click(function(event) {
  // Your code goes here
});

Beachten Sie, dass dies nur funktioniert, für Veranstaltungen mit jQuery gebunden (mit .bind oder jeder jQuery-Methode, dass Verwendungen .bind intern). Wenn Sie alle möglichen Onclick Ereignisse aus einer gegebenen Menge von Elementen entfernen möchten, können Sie verwenden:

$('.some-selector')
  .unbind('click') // takes care of jQuery-bound click events
  .attr('onclick', '') // clears `onclick` attributes in the HTML
  .each(function() { // reset `onclick` event handlers
    this.onclick = null;
  });

Andere Tipps

Ich möchte einen Gedanken schaffen, ohne alle Ereignisse entfernen alle zusammen (nur sie außer Kraft setzen).

Wenn Sie Ihr neues Single gebundenes Ereignis (wir nennen es „Klick“ hier) ist spezifisch für das Element, um es bindet, dann glaube ich, Sie irgendwelche anderen Ereignisse, die von stopPropagation einfach ignorieren können () Funktion. Wie dies

$("specific-selector").on("click", ".specific-class", function (e) {
  e.stopPropagation()
  // e.stopImmediatePropagation()
  /* your code continues ... */
});

Es wird Ereignisse stoppen sprudelt, so dass Ihre andere Veranstaltungen werden nicht ausgelöst. Verwendung stopImmediatePropagation () andere Ereignisse zu verhindern, auf die gleichen Elemente angebracht, wie „Klick“ der Fall ist.

Zum Beispiel, wenn "mouseleave" Ereignis auch zu $ ??( "specific-Selektor .specific-Klasse") Element binden wird, wird es nicht Feuer auch.

Endlich, werden alle anderen Ereignisse nicht das Feuer auf dieses Element aber Ihr neues „Klick“ Element.

Die ungelöste Frage ist, was passiert, wenn andere Veranstaltungen nutzen auch stopPropagation ()? ... Dann denke ich, das mit bester Spezifikation gewinnt, so versucht komplex, zu viele Ereignisse zu vermeiden, ist endgültig Vorschlag.

Sie können "Direct und delegierte Ereignisse", auf jQuery Website für weitere Informationen.

Sieht aus wie das ist ziemlich einfach eigentlich:

$('#foo').unbind('click');
$('#foo').bind('click', myNewFunction);

Vielen Dank für Ihre Antworten aber.

Versuchen Sie Live statt bind zu verwenden. Dann können Sie leicht entfernen Live Bindung mit sterben von Selektor, der einen schnellen Betrieb ist und gleich schnell eine andere Live-Set.

   $('selection here').live('..', .....);  // multiple invocations
   $('selection here').die();
   $('selection here').live('click',.....);

DOM wird nicht berührt. Ereignisbedingung bei Auftreten des Ereignisses ausgewertet wird.

Aber in der Regel, wenn Sie wollen einfach nur Swap-Handler-Funktionen, warum es nicht auf diese Weise zu tun:

var ahandler = function(evt) { /* first implementation */ }
$('.selector').bind('click', function(evt) { ahandler(evt); });

//and then if you want to change handlers
ahandler = function(evt) { /* new implementation */ };

Das gibt absolut keine Kosten für Änderungen, etc rebinding.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top