2011-07-10 12 views
4

jQueryデリゲートの最初の引数としてセレクタの代わりにオブジェクトを渡すことはできますか?最初の引数としてセレクタの代わりにjQueryデリゲートオブジェクト

var ancestor = $('ancestor'), 
    children = ancestor.find('a'); 

ancestor.delegate(children, eventType, handler); 

代わりの定期:

ancestor.delegate('a', eventType, handler); 

EDIT

動機:

var children = $('a[href^="#"]').map($.proxy(function(i, current) { 

    var href = $(current).attr('href'); 

    if(href.length > 1 && givenElement.find(href).length === 1) return $(current); 
}, 
this)); 

$(document).delegate(children, eventType, handler); 

私はハッシュ任意の要素にリンクされている唯一のアンカー要素を委任したいです与えられた要素の子として。基本的には、セレクターだけではできないことをしたいのです。

+0

これを行うためのあなたの動機は何ですか?あなたはそれを詳しく説明できますか? –

+0

@Caspar質問が更新されました。 – DADU

答えて

2

あなたはいつもちょうど委任を設定し、その後内のイベントハンドラあなたの述語を行うことができます:あなたはハンドラ内でそのjQueryのDOMの検索を行うための実行時の価格を避けたかった場合

ancestor.delegate('a[href^="#"]', 'click', function(ev) { 
    if (someElement.find($(ev.target).attr('href')).length > 0) { 
    // do whatever with ev.target 
    } 
}); 

、あなたは可能性が事前にタグ全て「良い」タグ:

$('a[href^="#"]').each(function() { 
    if (someElement.find($(this).attr('href')).length > 0) 
    $(this).addClass("special"); 
}); 

その後、あなたの委任されたイベントハンドラは、単にチェックすることができ

if ($(ev.target).hasClass('special')) { 
    // do stuff 
    } 

これは、どんな状況下でも問題にならないほど十分に機能します。

".delegate()"セレクタを使用して作業を開始する必要がある理由は、その実装方法です。イベントハンドラは、常に何かん:

function genericDelegateHandler(ev) { 
    if ($(ev.target).is(theSelector)) { 
     userHandler.call(this, ev); 
    } 
    } 

は今、明確にも試してみて、比較し、あなたが選択せずに、デリゲートを設定した場合の実際の要素を、それだけではないんでした。

編集 — @DADU(OP)は、正しく使用すると、クラス名ですべてをマークするトラブルに行く場合は、あなたもテスト派手なイベントハンドラを必要としないことを指摘します。通常の ".delegate()"がそれを行います。 :-)

+0

それについて考えましたが、それはすべてのハッシュリンクのバブルアップがあるので、それは本当に効率的ではありません。他の方法がないなら、私はこれにこだわるだろう。 – DADU

+1

@DADUハンドラをバインドするかどうかにかかわらず、すべてのイベントがバブルアップします。 –

+1

DOMの上にイベントをバブリングすることは、DOMが非常に深刻な場合を除いて非常に高価ではありません。ほとんどの親要素には登録ハンドラがありません。 – Pointy

関連する問題