Ich bin etwas verwirrt von dieser Frage. Ich denke, das liegt daran, dass du durch promise und delegate verwirrt bist. Das sind in der Tat völlig unabhängige Funktionen von jQuery. Ich erkläre jede separat:

delegate

delegate ist eine Funktion von jQuery, die in jQuery 1.4.2 eingeführt wurde. (Es handelt sich um einen schöneren Ansatz für die live-Funktion, die in jQuery 1.3 hinzugefügt wurde). Es löst ein bestimmtes Problem, das bei der Änderung des DOM auftritt, insbesondere bei AJAX-Aufrufen.

Wenn man einen Event-Handler bindet, bindet man ihn an eine Auswahl. Man könnte also $('.special').click(fn) einen Event-Handler an alle Elemente der Klasse special binden. Sie binden an diese Elemente. Wenn Sie die Klasse aus einem dieser Elemente entfernen, wird das Ereignis trotzdem ausgelöst. Umgekehrt, wenn Sie die Klasse zu einem Element hinzufügen (oder ein neues Element im DOM hinzufügen), wird es das Ereignis nicht gebunden haben.

Es gibt eine Funktion von Javascript, die dies abschwächt, genannt „Event Bubbling“. Wenn ein Ereignis ausgelöst wird, benachrichtigt der Browser zunächst das Element, von dem das Ereignis ausgeht. Dann geht er den DOM-Baum hinauf und benachrichtigt jedes Vorgängerelement. Das bedeutet, dass Sie einen Event-Handler an ein Element weiter oben im DOM-Baum binden können, und dass die Ereignisse bei allen untergeordneten Elementen ausgelöst werden (auch bei solchen, die zum Zeitpunkt der Bindung des Handlers noch nicht existierten).

delegate Das ist die Implementierung von jQuery. Zuerst wählt man ein übergeordnetes Element aus. Dann geben Sie einen Selektor an – der Handler wird nur ausgeführt, wenn das verursachende Element mit diesem Selektor übereinstimmt. Dann geben Sie einen Ereignistyp an, z. B. click, submit, keydown, genau wie bei bind. Schließlich geben Sie den Event-Handler an.

$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});

promise

promise ist eine weitere relativ neue Ergänzung des jQuery-Featuresets. Es ist Teil des Deferred-Konzepts, das in jQuery 1.5 eingeführt wurde. (Ich denke, die klangliche Ähnlichkeit zwischen „deferred“ und „delegate“ ist wahrscheinlich die Quelle der Verwirrung.) Dies ist eine Möglichkeit, die Komplikationen von asynchronem Code zu abstrahieren. Das beste Beispiel hierfür sind AJAX-Aufrufe, da das von $.ajax zurückgegebene Objekt ein Deferred-Objekt ist. Zum Beispiel:

$.ajax({ url: 'somepage.cgi', data: {foo: 'bar'}}).done(function() { // this will be run when the AJAX request succeeds}).fail(function() { // this will be run when the AJAX request fails}).always(function() { // this will be run when the AJAX request is complete, whether it fails or succeeds}).done(function() { // this will also be run when the AJAX request succeeds});

Es ist also in vielerlei Hinsicht dasselbe wie das Binden von Erfolgshandlern im $.ajax-Aufruf, außer dass Sie mehr als einen Handler binden können, und Sie können sie nach dem ersten Aufruf binden.

Ein anderes Mal, wenn es nützlich wäre, asynchron zu handeln, ist bei Animationen. Man kann Funktionen mit Callbacks versehen, aber es wäre schöner, dies mit einer ähnlichen Syntax zu tun, wie im AJAX-Beispiel oben.

In jQuery 1.6 wurde diese Funktionalität möglich gemacht, und promise ist Teil dieser Implementierung. Sie rufen promise bei einer jQuery-Auswahl auf und erhalten ein Objekt, an das Sie Event-Handler binden können, wenn alle Animationen im Objekt abgeschlossen sind.

Zum Beispiel:

$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});

Auch dies ist in der Wirkung ähnlich wie die traditionellen Methoden, aber es bietet mehr Flexibilität. Sie können die Handler später binden, und Sie können mehr als einen binden.

Zusammenfassung

Grundsätzlich gibt es keine signifikante Beziehung zwischen delegate und promise, aber sie sind beide nützliche Funktionen in modernem jQuery.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.