I’m a bit confused by this question. これは、promisedelegateに惑わされているからだと思います。 実はこれらはjQueryの全く関係のない機能なのです。 それぞれ別々に説明します。

delegate

delegate は、jQuery 1.4.2 で導入された jQuery の機能です。 (jQuery 1.3で追加されたliveの機能をよりきれいにしたものです)。 これは、DOM の変更、特に AJAX 呼び出しに伴う特定の問題を解決します。

イベント ハンドラをバインドする場合、それを選択項目にバインドします。 したがって、イベント ハンドラを special クラスのすべてのメンバーにバインドするために $('.special').click(fn) を行うかもしれません。 これらの要素にバインドしているので、それらの要素からクラスを削除しても、イベントはトリガーされます。 逆に、クラスを要素に追加する (または DOM に新しい要素を追加する) と、その要素にはイベントがバインドされません。

Javascript には、これを緩和する「イベント バブリング」と呼ばれる機能があります。 イベントがトリガーされると、まず、ブラウザはイベントが発生した要素に通知します。 次に、DOM ツリーを上がっていき、各先祖の要素に通知します。 つまり、DOM ツリーの上位にある要素にイベント ハンドラをバインドすると、任意の子要素(ハンドラがバインドされたときに存在しない要素も含む)でイベントがトリガーされるのです。 まず、親要素を選択します。 次に、セレクタを指定します。ハンドラは、元の要素がこのセレクタに一致する場合にのみ実行されます。 次に、clicksubmitkeydown などのイベントタイプを指定します(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 を呼び出すと、オブジェクトのすべてのアニメーションが完了したときに、イベント ハンドラをバインドできるオブジェクトを取得できます。 ハンドラを後でバインドすることができ、複数をバインドできます。

概要

基本的に、delegatepromise には大きな関係はありませんが、どちらも最新の jQuery の便利な機能です。

コメントを残す

メールアドレスが公開されることはありません。