Egy kicsit össze vagyok zavarodva ezzel a kérdéssel. Szerintem ez azért van, mert a promise
és a delegate
zavart okoz neked. Ezek valójában a jQuery teljesen független tulajdonságai. Elmagyarázom őket külön-külön:
delegate
delegate
a jQuery egy olyan funkciója, amelyet a jQuery 1.4.2-ben vezettek be. (Ez egy szebb megközelítése a live
funkciónak, amely a jQuery 1.3-ban jelent meg). Megold egy speciális problémát, amely a DOM módosításával, és különösen az AJAX-hívásokkal jár.
Az eseménykezelő kötésével egy kijelöléshez kötjük. Tehát megtehetjük $('.special').click(fn)
, hogy egy eseménykezelőt a special
osztály összes tagjához kötünk. Ezekhez az elemekhez kötöd, így ha ezután eltávolítod az osztályt az egyik elemről, az esemény akkor is elindul. Fordítva, ha az osztályt hozzáadjuk egy elemhez (vagy új elemet adunk hozzá a DOM-hoz), akkor az nem lesz eseményhez kötve.
A Javascriptnek van egy olyan funkciója, amely ezt enyhíti, az úgynevezett “event bubbling”. Egy esemény kiváltásakor a böngésző először azt az elemet értesíti, ahonnan az esemény származik. Ezután felmegy a DOM-fán, és értesít minden egyes őselemet. Ez azt jelenti, hogy eseménykezelőt köthetünk egy, a DOM-fában magasan elhelyezkedő elemhez, és az események bármelyik gyermekelemen elindulnak (még azokon is, amelyek nem léteznek, amikor a kezelőt kötöttük).
delegate
A jQuery ennek a megvalósítása. Először kiválasztunk egy szülő elemet. Ezután megadsz egy szelektort – a kezelő csak akkor fut le, ha a kiinduló elem megfelel ennek a szelektornak. Ezután megadsz egy eseménytípust, például click
, submit
, keydown
, ugyanúgy, mint a bind
esetében. Végül pedig megadjuk az eseménykezelőt.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
A jQuery funkciókészletének egy másik, viszonylag friss kiegészítése. A Deferred
koncepció része, amelyet a jQuery 1.5-ben vezettek be. (Azt hiszem, a “deferred” és a “delegate” hangzásbeli hasonlósága valószínűleg a félreértés forrása.) Ez egy módja az aszinkron kód bonyodalmainak absztrahálásának. A legjobb példa erre az AJAX-hívásoknál van, mivel a $.ajax
által visszaadott objektum egy Deferred
objektum. Például:
$.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});
Ez tehát sok szempontból ugyanaz, mint a $.ajax
hívásban a sikerkezelők lekötése, azzal a különbséggel, hogy több kezelőt is leköthetünk, és a kezdeti hívás után is leköthetjük őket.
Egy másik eset, amikor hasznos lenne aszinkron módon kezelni, az animációk. A függvényekhez megadhatsz visszahívásokat, de szebb lenne, ha ezt a fenti AJAX példához hasonló szintaxissal tehetnéd meg.
A jQuery 1.6-ban ez a funkcionalitás lehetővé vált, és a promise
ennek az implementációnak a része. Meghívod a promise
-t egy jQuery-kiválasztáson, és kapsz egy objektumot, amelyhez eseménykezelőket köthetsz, amikor az objektumban lévő összes animáció befejeződött.
Például:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Ez is hasonló hatású, mint a hagyományos módszerek, de rugalmasságot ad. A kezelőket később is köthetjük, és több kezelőt is köthetünk.
Összefoglaló
Lényegében nincs jelentős kapcsolat a delegate
és a promise
között, de mindkettő hasznos funkció a modern jQuery-ben.