Ik ben een beetje in de war door deze vraag. Ik denk dat dit komt omdat je in de war bent door promise en delegate. Het zijn in feite totaal ongerelateerde functies van jQuery. Ik zal ze elk afzonderlijk uitleggen:

delegate

delegate is een functie van jQuery die is geïntroduceerd in jQuery 1.4.2. (Het is een mooiere benadering van de live-functie die in jQuery 1.3 werd toegevoegd). Het lost een bepaald probleem op dat zich voordoet bij het wijzigen van de DOM, en in het bijzonder bij AJAX calls.

Wanneer je een event handler bindt, bind je deze aan een selectie. Dus je zou kunnen doen $('.special').click(fn) om een event handler te binden aan alle leden van de special klasse. Je bindt aan die elementen, dus als je dan de klasse van een van die elementen verwijdert, zal de gebeurtenis nog steeds worden getriggerd. Omgekeerd, als je de klasse aan een element toevoegt (of een nieuw element in het DOM toevoegt), zal het niet de gebeurtenis gebonden hebben.

Er is een functie van Javascript die dit verzacht, genaamd “event bubbling”. Wanneer een gebeurtenis wordt getriggerd, informeert de browser eerst het element waar de gebeurtenis vandaan komt. Dan gaat het omhoog in de DOM boom, en verwittigt elk voorouder element. Dit betekent dat je een event handler kunt binden aan een element hoog in de DOM-boom, en dat events worden geactiveerd op alle child-elementen (zelfs die niet bestaan op het moment dat de handler wordt gebonden).

delegate is jQuery’s implementatie van dit. Eerst selecteer je een parent-element. Vervolgens geef je een selector op – de handler wordt alleen uitgevoerd als het oorspronkelijke element met deze selector overeenkomt. Dan specificeer je een event type, zoals click, submit, keydown, net als bij bind.

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

promise

promise is een andere relatief recente toevoeging aan de jQuery featureset. Het maakt deel uit van het Deferred-concept dat in jQuery 1.5 werd geïntroduceerd. (Ik denk dat de gelijkenis in klank tussen “deferred” en “delegate” waarschijnlijk de bron van verwarring is). Dit is een manier om de complicaties van asynchrone code weg te abstraheren. Het beste voorbeeld hiervan is met AJAX-aanroepen, aangezien het object teruggegeven door $.ajax een Deferred object is. Bijvoorbeeld:

$.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});

Dus het is in veel opzichten hetzelfde als het binden van succes handlers in de $.ajax aanroep, behalve dat je meer dan een handler kunt binden, en je kunt ze binden na de eerste aanroep.

Een ander moment waarop het nuttig zou zijn om asynchroon te handelen is met animaties. Je kunt callbacks geven aan functies, maar het zou mooier zijn om dit te doen met een vergelijkbare syntaxis als het AJAX-voorbeeld dat ik hierboven heb gegeven.

In jQuery 1.6 is deze functionaliteit mogelijk gemaakt, en promise is onderdeel van deze implementatie. Je roept promise aan op een jQuery-selectie, en je krijgt een object waaraan je event handlers kunt binden, wanneer alle animaties in het object zijn voltooid.

Bijvoorbeeld:

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

Ook dit is qua effect vergelijkbaar met traditionele methoden, maar het voegt flexibiliteit toe. Je kunt de handlers later binden, en je kunt er meer dan een binden.

Samenvatting

In principe is er geen significante relatie tussen delegate en promise, maar ze zijn beide nuttige functies in moderne jQuery.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.