63

私は本当に何delegatepromiseあるかを理解していません。

ドキュメントによると-

  • delegateセレクターとイベントをある種のラッピングコンテナーにバインドし、後で現在および将来のアイテムに再び使用できるようにします。
  • promise()新しくロードされたすべてが一致する場合、最初にバインドされたときまで物事を再マップします。たぶん私はこの約束の方法を本当に理解していません。

ラッパーがまだ存在しているが、ラッパーコンテナの内容が変更されているか、経由でリロードされている場合はどうなりますAjaxか?初めてバインドされたときのように、イベントがトリガーまたは機能しないのはなぜですか?

そして、はい、私はドキュメントページに行ったことがあります、私は彼らの説明を完全に理解していません。

4

1 に答える 1

205

私はこの質問に少し混乱しています。とに戸惑うからだと思います。実際、これらはjQueryの完全に無関係な機能です。それぞれを個別に説明します。promisedelegate

delegate

delegatejQuery1.4.2で導入されたjQueryの機能です。live(これは、 jQuery 1.3で追加された機能へのより良いアプローチです)。これは、DOMの変更、特にAJAX呼び出しに伴う特定の問題を解決します。

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

これを軽減する「イベントバブリング」と呼ばれるJavascriptの機能があります。イベントがトリガーされると、最初にブラウザはイベントが発生した場所を要素に通知します。次に、DOMツリーを上って、各祖先要素に通知します。これは、DOMツリーの上位にある要素でイベントハンドラーをバインドでき、任意の子要素(ハンドラーがバインドされたときに存在しなかった要素でも)でイベントがトリガーされることを意味します。

delegateこれのjQueryの実装です。まず、親要素を選択します。次に、セレクターを指定します。ハンドラーは、元の要素がこのセレクターと一致する場合にのみ実行されます。次に、と同様に、、、clickなどのイベントタイプを指定します。最後に、イベントハンドラーを指定します。submitkeydownbind

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

promise

promisejQuery機能セットへのもう1つの比較的最近の追加です。これはDeferred、jQuery1.5で導入された概念の一部です。(「据え置き」と「委任」の音の類似性がおそらく混乱の原因だと思います。)これは、非同期コードの複雑さを抽象化する方法です。によって返されるオブジェクトはオブジェクトであるため、これの最良の例は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したがって、複数のハンドラーをバインドでき、最初の呼び出しの後にそれらをバインドできることを除いて、多くの点で呼び出しで成功ハンドラーをバインドするのと同じです。

非同期で処理することが役立つもう1つの方法は、アニメーションです。関数にコールバックを提供することもできますが、上記で提供したAJAXの例と同様の構文でこれを行う方がよいでしょう。

jQuery 1.6では、この機能が可能になりpromise、この実装の一部になっています。jQueryの選択を呼び出すpromiseと、オブジェクト内のすべてのアニメーションが完了したときに、イベントハンドラーをバインドできるオブジェクトが取得されます。

例えば:

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

繰り返しになりますが、これは従来の方法と効果的に似ていますが、柔軟性が追加されます。後でハンドラーをバインドすることも、複数のハンドラーをバインドすることもできます。

概要

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

于 2011-06-04T15:28:01.227 に答える