jQuery のon
イベント ハンドラーは、動的に作成された要素を「リッスン」できるように設計されており、live
. ただし、私が経験したことは、使用は成功しているのに、使用on
はクリックイベントをキャプチャしていないということです!live
私の状況のトリッキーな側面は、コンテンツを動的に作成するだけでなく、AJAX 呼び出しを介して作成し、結果の HTML をモーダルjQueryUI ポップアップ.get()
に挿入していることです。.dialog()
これは、私が達成しようとしていたことの簡略化されたバージョンです( に包まれてい$(document).ready(...)
ます):
$.get("getUserDataAjax.php", queryString, function(formToDisplay) {
$("#dialog").dialog({
autoOpen: true,
modal: true,
buttons...
}).html(formToDisplay);
});
$(".classThatExistsInFormToDisplay").on("click", function() {
alert("This doesn't get called");
});
のドキュメントから、これを見つけました。これは、イベントon
の作成にどのように取り組んでいたかです。on
$("p").on("click", function(){
alert( $(this).text() );
});
ただし、何らかの理由で、live
期待どおりに動作しますon
が、失敗しています。
コールバック内でon
宣言すると成功する(クリックをキャプチャする)ことがわかったので、これは「どうすれば機能させることができるか」という質問ではありません。function(formToDisplay)
私の質問はon
、モーダル ポップアップ内で動的に作成された要素が見つからないことの何が問題なのですか? 私の jQuery インスタンスは jquery-1.7.2 です。jQueryUI は 1.8.21 です。
この問題に近い 2 つの jsFiddle を次に示します。両方のインスタンスで「テスト」という単語をクリックして、異なる動作を確認します。コードの唯一の違いは、 for を置き換えるon
ことですlive
。
によってクリックがキャプチャされる場所live
。
クリックがキャプチャされない場所on
(何も起こらないことを確認するには、[テスト - クリックしてください] をクリックします)。
on
不適切に使用したり、意図していないことを要求したりするだけかもしれませんが、なぜ機能しないのか知りたいです (ただし、非常に賢いものがある場合は、自由に共有してください)。あなたの知恵をありがとう!
更新/回答/解決策:
ユーザー「未定義」によると、違いは、オブジェクトon
の上部から完全に委任されていないのに対し、委任されている/そうであるということです。document
live
クラウディオが言及しているように、on
動的に作成された要素を参照するドキュメントの$("")
部分があり、クエリの一部に含めるものは実行時に存在する必要があります。
ここに私の新しい解決策があります:クリックイベントをキャプチャするon
私のモーダルダイアログは、実行時にイベントが作成されたときにコンテンツを持っていませんが、後で生成される特別なクラスを持つコンテンツと要素を見つけることができます。
$("#dialog").on("click", ".classThatExistsInFormToDisplay", function() {
... //(success! Event captured)
});
本当にありがとう!