Tato otázka mě trochu mate. Domnívám se, že je to proto, že jste zmaten promise a delegate. Ve skutečnosti se jedná o zcela nesouvisející funkce jQuery. Vysvětlím každou zvlášť:

delegát

delegate je funkce jQuery, která byla zavedena ve verzi jQuery 1.4.2. Je to funkce, která je součástí jQuery. (Jedná se o příjemnější přístup k funkci live, která byla přidána v jQuery 1.3). Řeší určitý problém, který nastává při úpravě DOM a zejména při volání AJAXu.

Když provážete obsluhu události, provážete ji s výběrem. Takže byste mohli udělat $('.special').click(fn) vazbu obsluhy události na všechny členy třídy special. Vážeš se k těmto prvkům, takže pokud pak třídu z jednoho z těchto prvků odstraníš, událost bude stále spuštěna. A naopak, pokud třídu přidáte k nějakému prvku (nebo přidáte nový prvek do DOM), nebude mít navázanou událost.

Existuje vlastnost Javascriptu, která toto zmírňuje a nazývá se „bublinkování událostí“. Při spuštění události prohlížeč nejprve upozorní prvek, ve kterém událost vznikla. Poté postupuje vzhůru stromem DOM a oznamuje každý předcházející prvek. To znamená, že můžete navázat obsluhu události na prvek vysoko ve stromu DOM a události se spustí na všech podřízených prvcích (dokonce i na těch, které v okamžiku navázání obsluhy neexistují).

delegate je implementace této funkce v jQuery. Nejprve vyberete nadřazený prvek. Poté zadáte selektor – obslužná rutina se spustí pouze v případě, že původní prvek odpovídá tomuto selektoru. Pak zadáte typ události, například click, submit, keydown, stejně jako u bind. Pak konečně určíte obsluhu události.

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

promise

promise je dalším poměrně nedávným přírůstkem do sady funkcí jQuery. Je součástí konceptu Deferred, který byl zaveden ve verzi 1.5 softwaru jQuery. (Myslím, že zdrojem záměny je pravděpodobně podobnost zvuku slov „deferred“ a „delegate“). Jedná se o způsob, jak abstrahovat od komplikací asynchronního kódu. Nejlepším příkladem je to u volání AJAX, protože objekt vrácený pomocí $.ajax je objekt Deferred. Například:

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

Takže je to v mnoha ohledech stejné jako vázání obsluh úspěchu ve volání $.ajax, až na to, že můžete vázat více než jednu obsluhu a můžete je vázat i po prvním volání.

Dalším případem, kdy by bylo užitečné řešit to asynchronně, jsou animace. Funkcím můžete poskytnout zpětná volání, ale bylo by příjemnější to udělat s podobnou syntaxí jako v příkladu AJAX, který jsem uvedl výše.

V jQuery 1.6 byla tato funkce umožněna a promise je součástí této implementace. Zavoláte promise na výběr jQuery a získáte objekt, na který můžete navázat obsluhy událostí, až se všechny animace v objektu dokončí.

Například:

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

Znovu je to ve výsledku podobné tradičním metodám, ale přidává to flexibilitu. Obsluhy můžete svázat později a můžete jich svázat více než jednu.

Shrnutí

V podstatě mezi delegate a promise není žádný významný vztah, ale obě jsou užitečnými funkcemi v moderním jQuery.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.