Bevor Sie dies lesen, rufen Sie diese Liste der Ereignisse auf einer anderen Seite auf. Die API selbst ist äußerst hilfreich, und alles, was ich unten diskutiere, ist direkt von dieser Seite aus verlinkt .
Erstens .click(function)
ist buchstäblich eine Abkürzung für .bind('click', function)
, sie sind gleichwertig. Verwenden Sie sie, wenn Sie einen Handler direkt an ein Element binden , wie folgt:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Wenn dieses Element ersetzt oder weggeworfen wird, ist dieser Handler nicht mehr da. Auch Elemente, die nicht vorhanden waren, als dieser Code zum Anhängen des Handlers ausgeführt wurde (z. B. der Selektor hat ihn dann gefunden), erhalten den Handler nicht.
.live()
und .delegate()
sind ähnlich verwandt, .delegate()
tatsächlich .live()
intern verwendet, beide warten auf Ereignisse, um zu sprudeln. Dies funktioniert für neue und alte Elemente , sie sprudeln Ereignisse auf die gleiche Weise. Sie verwenden diese, wenn sich Ihre Elemente ändern können, z. B. wenn Sie neue Zeilen, Listenelemente usw. hinzufügen. Wenn Sie keinen übergeordneten / gemeinsamen Vorfahren haben, der auf der Seite verbleibt und zu keinem Zeitpunkt ersetzt wird, verwenden Sie .live()
Folgendes:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Wenn Sie jedoch irgendwo ein übergeordnetes Element haben, das nicht ersetzt wird (damit die Ereignishandler nicht auf Wiedersehen gehen), sollten Sie damit .delegate()
wie folgt umgehen :
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Dies funktioniert fast genauso wie .live()
, aber das Ereignis sprudelt weniger oft, bevor es erfasst und die Handler ausgeführt werden. Eine weitere häufige Verwendung dieser beiden Methoden ist, dass sich Ihre Klasse für ein Element ändert und nicht mehr mit dem ursprünglich verwendeten Selektor übereinstimmt. Bei diesen Methoden wird der Selektor zum Zeitpunkt des Ereignisses ausgewertet. Wenn er übereinstimmt, wird der Handler ausgeführt. Damit das Element nicht mehr mit dem Selektor übereinstimmt, wird es nicht mehr ausgeführt. Mit .click()
jedoch der Ereignishandler gebunden direkt am DOM - Elemente ist die Tatsache , dass es nicht paßt , was Selektor verwendet , es zu finden ist irrelevant ... das Ereignis gebunden ist und es bleiben , bis das Element weg ist, oder der Handler wird über entfernt .unbind()
.
Eine weitere häufige Verwendung für .live()
und .delegate()
ist Leistung . Wenn Sie mit vielen Elementen arbeiten, ist das Anbringen eines Klick-Handlers direkt an jedem Element teuer und zeitaufwändig. In diesen Fällen ist es wirtschaftlicher, einen einzelnen Handler einzurichten und das Sprudeln die Arbeit erledigen zu lassen. Schauen Sie sich diese Frage an, bei der es einen großen Unterschied gemacht hat. Sie ist ein gutes Beispiel für die Anwendung.
Auslösen - für die aktualisierte Frage
Es stehen zwei Hauptfunktionen zum Auslösen von Ereignishandlern zur Verfügung, die in der API unter dieselbe Kategorie "Anhang für Ereignishandler" fallen. Dies sind .trigger()
und .triggerHandler()
. .trigger('eventName')
In den allgemeinen Ereignissen sind einige Verknüpfungen integriert, zum Beispiel:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Sie können hier eine Liste mit diesen Verknüpfungen anzeigen .
Der Unterschied .trigger()
löst den Ereignishandler aus (meistens jedoch nicht die Standardaktion, z. B. das Platzieren des Cursors an der richtigen Stelle bei einem Klick <textarea>
). Dadurch werden die Ereignishandler in der Reihenfolge ausgeführt, in der sie gebunden waren (wie es das native Ereignis tun würde), die nativen Ereignisaktionen ausgelöst und das DOM in die Luft gesprudelt.
.triggerHandler()
dient normalerweise einem anderen Zweck. Hier versuchen Sie nur, die gebundenen Handler auszulösen. Dies führt nicht dazu, dass das native Ereignis ausgelöst wird, z. B. das Senden eines Formulars. Das DOM sprudelt nicht in die Luft und ist nicht verkettbar (es gibt alles zurück, was der zuletzt gebundene Ereignishandler für dieses Ereignis zurückgibt). Wenn Sie beispielsweise ein focus
Ereignis auslösen möchten, das Objekt jedoch nicht fokussieren möchten, möchten Sie nur, dass der Code, an den Sie gebunden sind .focus(fn)
, ausgeführt wird. Dies würde dies tun, während .trigger()
dies das gleiche tun würde, wie das Element tatsächlich fokussieren und in die Luft sprudeln.
Hier ist ein Beispiel aus der Praxis:
$("form").submit(); //actually calling `.trigger('submit');`
Dies würde alle Submit-Handler ausführen, zum Beispiel das jQuery-Validierungs-Plugin , und dann versuchen, das zu senden <form>
. Wenn Sie jedoch nur validieren möchten, da es über einen submit
Ereignishandler angeschlossen ist, aber nicht danach übermittelt <form>
, können Sie Folgendes verwenden .triggerHandler('submit')
:
$("form").triggerHandler('submit');
Das Plugin verhindert, dass der Handler das Formular sendet, indem er bombardiert, wenn die Validierungsprüfung nicht bestanden wird. Bei dieser Methode ist es uns jedoch egal, was sie tut. Unabhängig davon, ob es abgebrochen wurde oder nicht, versuchen wir nicht , das Formular zu senden. Wir wollten es nur auslösen, um es erneut zu validieren und nichts anderes zu tun. ( Haftungsausschluss: Dies ist ein überflüssiges Beispiel, da .validate()
das Plugin eine Methode enthält, aber es ist eine anständige Illustration der Absicht.)