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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.