2011-06-21 13 views
1
$(document).ready(function() { 
    $("img.tile").click(function() { 
    var actid = $(this).data().id; 
    $("#lz").load("/dialog/pre?actid=" + actid); 
    $("#btnCheck").click(function() { 
     alert("test"); 
    }); 
}); 

を呼び出す負荷()の呼び出しは<input id="btnCheck" value="Check" /> を持っているHTMLフラグメントをもたらします。しかし、私はそれをクリックしたときにイベントは発生しません。 フラグメントがどのように読み込まれているかに関係している必要があります。この作品をどうやって作っていますか?.LOAD後のIDによる要素のjQueryのアクセスは()

+0

.load()が非同期の場合、.load()のコールバックにクリックハンドラを追加する必要があります。そしてドキュメンテーションによると、それはそうであるように見えます。 :) – bzlm

答えて

4

最も良い方法は、delegateを使用し、イベントバブルを利用して、まだ存在しない要素のイベントを取得することです。これはコンテキストを提供するために、既存の選択に作業することができ、特にとして、非常に簡単です:

$(document).ready(function() { 
    $("img.tile").click(function() { 
     var actid = $(this).data().id; 
     $("#lz") 
      .load("/dialog/pre?actid=" + actid) 
      .delegate("#btnCheck", "click", function() { 
       alert("test"); 
      }); 
    }); 
}); 

これはload例と機能的に同等であるが、いくつかの点で若干優れた性能を持っています。

+0

jQueryのライブ呼び出しとデリゲート呼び出しの説明を読んでください。私は違いを理解しているか分からない。なぜ2つの電話が必要なのですか? – BuddyJoe

+0

@tyndall [だから、 'delegate'と' live'を比較する質問](http://stackoverflow.com/questions/4204316/jquery-live-vs-delegate) 「2通話」は何を意味しますか? – lonesomeday

+0

私は2つの方法を意味しました。もう一つの質問を見てください。 – BuddyJoe

5

データがロードされたことを確認した後、またはliveイベントを使用して添付するには、clickイベントを添付する必要があります。あなたは、データがロードされたことを確認された後

$("#btnCheck").live('click', function() { 
    alert("test"); 
}); 

また、あなたがそれを添付することができます:それは現在または将来の任意の時点でそれを見つけ、実装がおそらく最も簡単である場合liveは、ハンドラをアタッチします。 @bzlmが彼のコメントloadで指摘したように、非同期イベントであるため、後続のコードで終了したとはみなせません。幸いloadがロードされていますが、すべてのデータの後に発火する2番目の引数として関数を渡すことができます:

$("#lz").load("/dialog/pre?actid=" + actid, function() { 
    $("#btnCheck").click(function() { 
     alert("test"); 
    }); 
}); 
+3

* "生きている人が、今や将来、いつでもそれを見つけることができたら、ハンドラをつけるでしょう" * .live()の仕組みとは異なります。ハンドラは呼び出されたときにただちにアタッチしますが、 'document'にアタッチされています。 * 'document'にバブルするページ*をクリックするたびに' '#btnCheck ''セレクタがテストされ、一致するものがあればハンドラが呼び出されます。 '.delegate()'メソッドも同じですが、よりローカライズされていますので、(私にはとにかく)優先されます。 :o) – user113716

1

試してみてください。

$(document).ready(function() { 
    $("img.tile").click(function() { 
    var actid = $(this).data().id; 
    $("#lz").load("/dialog/pre?actid=" + actid); 
    $("#btnCheck").live('click', function() { 
     alert("test"); 
    }); }); 

この後にDOMに追加された要素をピックアップしますロードイベント。より良い方法が使用されるかもしれない.delegate()

+0

コードが$( "#btnCheck")を持っていれば動作しますか?それは正しいはずですか?後でDOMにちょうど現れるものを説明しているからでしょうか?この方法で生きて代理することはできません。 – BuddyJoe

+0

これは問題ありません。私の名前をMis-namedとしました。 – BuddyJoe

+0

ありがとうございますlnrbob +1 – BuddyJoe