4

ボタンをクリックした後に作成される div 要素にクリック イベントをバインドしています。私は .live() を使用していますが、これは機能しています。.live ではなく .delegate() を使用するべきだと聞いたことがあります。だから私はそれを試してみましたが、動作していませんが、.live は動作しています。

私の作業中のjQuery:

$(".myDiv").live("click",function () {
    var Pos = $(this).offset();
    $("#Container").css("left", Pos.left).css("top", Pos.top);
});

動作しないjQuery:

$(".myDiv").delegate("div","click",function () {
    var Pos = $(this).offset();
    $("#Container").css("left", Pos.left).css("top", Pos.top);
});

divのHTML

<div class="myDiv"></div>

なぜ代理人が私のために働いていないのですか?

4

3 に答える 3

6

1.7以降.live()は非推奨となり、 .on().delegate()に取って代わられました。

$("body").on("click","div.myDiv",function () { 
    var Pos = $(this).offset(); 
    $("#Container").css("left", Pos.left).css("top", Pos.top); 
});

.on()今はスーパーバインダーです;)

確実に含まれるターゲットに最も近いもの、できれば ID を持つものにバインドしてみてください。

<div id="mainContent">
    <div class="myDiv"></div><!-- Dynamically created div -->
</div>

ここでの優れたターゲットは #mainContent です

$("#mainContent").on("click","div.myDiv",function () { 
    var Pos = $(this).offset(); 
    $("#Container").css("left", Pos.left).css("top", Pos.top); 
});
于 2012-01-10T16:08:09.860 に答える
4

あなたの間違いは、どの要素がイベント ハンドラーをトリガーする必要があるか (の最初のパラメーターのセレクターを使用delegate) と、どの親要素がイベントを発生させる責任があるか (チェーンを開始する jQuery オブジェクトのセレクターを使用) を正しく指定していないことです。 .

正しい方法は次のようなものです

$("body").delegate("div.myDiv","click",function () { 
    var Pos = $(this).offset(); 
    $("#Container").css("left", Pos.left).css("top", Pos.top); 
}); 

delegateの例を参照してください。

jQuery 1.7 以降では、delegate(他のすべてのイベント バインディング メソッドと共に) メソッドに取って代わられon、まったく同じ方法で使用されます。

$('body').on('click','div.myDiv',function() {
    // ...
});
于 2012-01-10T16:06:00.097 に答える
1

1.7以降を使用している場合は、 .on()への切り替えを検討する必要がありますが、デリゲートの質問に対する回答は次のとおりです。

jQuery live()は基本的に、イベントハンドラーをwidow.documentオブジェクト全体にバインドします。これにより、ソースがセレクターと一致した場合、すべてのイベント(指定されたイベントタイプと一致する)が問い合わせられます。実行した場合は、ハンドラーを起動します。これにより、動的に追加された要素から発生するイベントを処理できます。

jQueryのdelegate()はlive()に似ていますが、window.documentだけでなく、コンテナーのセレクターを指定できる点が異なります。これは、少数のイベントのソースに問い合わせることになるため、パフォーマンスが向上することを意味します。

デリゲート()に変更してlive()の動作を正確に再現したい場合は、

$(selector).live('eventType', handlerFunc);

になる:

$(document).delegate(selector, 'eventType', handlerFunc);

$(document)をdelegate()呼び出しに保持しても、何も得られないことに注意することが重要です。このセレクターを、動的要素が作成されるより具体的なコンテナーに変更する必要があります。

于 2012-01-10T16:24:29.587 に答える