I’m a bit confused by this question. これは、promise
とdelegate
に惑わされているからだと思います。 実はこれらはjQueryの全く関係のない機能なのです。 それぞれ別々に説明します。
delegate
delegate
は、jQuery 1.4.2 で導入された jQuery の機能です。 (jQuery 1.3で追加されたlive
の機能をよりきれいにしたものです)。 これは、DOM の変更、特に AJAX 呼び出しに伴う特定の問題を解決します。
イベント ハンドラをバインドする場合、それを選択項目にバインドします。 したがって、イベント ハンドラを special
クラスのすべてのメンバーにバインドするために $('.special').click(fn)
を行うかもしれません。 これらの要素にバインドしているので、それらの要素からクラスを削除しても、イベントはトリガーされます。 逆に、クラスを要素に追加する (または DOM に新しい要素を追加する) と、その要素にはイベントがバインドされません。
Javascript には、これを緩和する「イベント バブリング」と呼ばれる機能があります。 イベントがトリガーされると、まず、ブラウザはイベントが発生した要素に通知します。 次に、DOM ツリーを上がっていき、各先祖の要素に通知します。 つまり、DOM ツリーの上位にある要素にイベント ハンドラをバインドすると、任意の子要素(ハンドラがバインドされたときに存在しない要素も含む)でイベントがトリガーされるのです。 まず、親要素を選択します。 次に、セレクタを指定します。ハンドラは、元の要素がこのセレクタに一致する場合にのみ実行されます。 次に、click
、submit
、keydown
などのイベントタイプを指定します(bind
と同様)。
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
は、jQuery の機能セットに比較的最近追加されたもう 1 つの機能です。 これは、jQuery 1.5 で導入された Deferred
コンセプトの一部です。 (「deferred」と「delegate」の音が似ていることが、おそらく混乱の元になっていると思います)。 これは、非同期コードの複雑さを抽象化する方法です。 この最も良い例はAJAXの呼び出しで、$.ajax
で返されるオブジェクトはDeferred
オブジェクトだからです。 たとえば、
$.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});
つまり、複数のハンドラをバインドできることと、最初の呼び出しの後でそれらをバインドできることを除けば、多くの点で$.ajax
呼び出しでサクセス ハンドラをバインドするのと同じことです。 関数にコールバックを提供することができますが、私が上で提供した AJAX の例と同様の構文でこれを行う方が良いでしょう。
jQuery 1.6 では、この機能が可能になり、promise
はこの実装の一部です。 jQuery の選択項目で promise
を呼び出すと、オブジェクトのすべてのアニメーションが完了したときに、イベント ハンドラをバインドできるオブジェクトを取得できます。 ハンドラを後でバインドすることができ、複数をバインドできます。
概要
基本的に、delegate
と promise
には大きな関係はありませんが、どちらも最新の jQuery の便利な機能です。