2009-07-26 13 views
0

タイトルは全く意味をなさないかもしれません..しかし、とにかく、私はそれを明確にするための簡単なコードを入れています。イベントハンドラは作成された要素には適用されません

私は

jQueryの1.3.2を使用していますが、ここに私のJS、HTMLで

$(document).ready(function() { 
    $('#test').click(function() { 
    $('#result').html('<a href="#" id="hello">hello world</a>'); 
    }); 

    $('#hello').click(function() { 
    $('#result').html('<a href="#" id="asdf">Test #2</a>'); 
    }); 
}); 

ですが、私はハイパーリンクのid = 'テスト' とID = '結果' がdiv要素を持っています。このJSコードは、テストをクリックすると、「Hello World」を表示します。その後、私は「Hello Worldのを」クリックすると、それは

任意の提案は非常に便利です...

はありがとう「をテスト#2」を表示するようになって。

+2

質問を編集してください。これはAJAXとは関係ありません。 – hobodave

答えて

8

hobodaveによると、これはAjaxとは関係ありません。

問題は、ドキュメントがロードされたとき(DOMの準備ができているとき)にclick()関数がHTMLに添付されていることです。しかし、その時点では、Hello World部門はまだ存在していません。作成時にクリックイベントは発生しません。

新しいdivが追加されたときにclick()を追加するか、代わりにlive()関数を使用してイベントハンドラをアタッチします。言っ

$(document).ready(function() { 
    $('#test').live('click',function() { 
    $('#result').html('<a href="#" id="hello">hello world</a>'); 
    }); 

    $('#hello').live('click',function() { 
    $('#result').html('<a href="#" id="asdf">Test #2</a>'); 
    }); 
}); 

、あなたが望む機能についても簡単方法は、ちょうど2つの既存のdivにhide()show()を使用することです。

+0

私の毎日の投票数をリセットすると+1。私のソリューションよりも多くの選択肢を提供します。 – hobodave

+0

ダニエル、あなたの答えをありがとう。あなたが私に紹介する「生きている」機能に感謝します。 :) –

2

まず、あなたの質問はAJAXとは関係ありません。これは純粋なjavascriptです。上で定義したonClickリスナーは、ページのロード時に適切な要素(特にDOM Readyイベント)にバインドされます。ページがロードされると、id = "hello"の要素は存在しないため、バインドされたリスナーは取得されません。何をする必要がある巣は、ID =「こんにちは」ID =「結果」のクリックイベント

内部例えばバインディングリスナー

です

$(document).ready(function() { 
    $('#test').click(function() { 
    $('#result').html('<a href="#" id="hello">hello world</a>'); 
    $('#hello').click(function() { 
     $('#result').html('<a href="#" id="asdf">Test #2</a>'); 
    }); 
    }); 
}); 
+0

hobodave、私はSubmitボタンを押すと、これはAjaxとは何の関係もないことに気付きました。ははは。しかし、あなたのアドバイスや提案に感謝します。これは非常に役に立ちます。 –

0

id="test"を持つ要素がクリックされるまで、それはDOMに存在しないとして、ドキュメント準備に設定id="hello"を持つ要素のクリックイベントハンドラを要素にバインドされないからです。

これを解決する1つの方法は、イベント委任とlive()コマンドを使用することです。

もう1つの方法は、DOMに要素を追加すると同時にクリックイベントハンドラを定義することです。以下は

$(function() { 
    $('#test').click(function() { 
    $('#result') 
     .html('<a href="#" id="hello">hello world</a>'); 
     $('#hello').click(function() { 
      $('#result').html('<a href="#" id="asdf">Test #2</a>'); 
      // to prevent event propagation 
      return false; 
     }); 
    // to prevent event propagation 
    return false;  
    });  
}); 

このシナリオでは正常に動作しますjQueryの他の要素に要素を追加するためのコマンド特定のがありますが、このシナリオではうまく機能するであろうものがappend()appendTo()です。これは、例を使用してappendTo()

$(function() { 
    $('#test').click(function() { 

    $('<a href="#" id="hello">hello world</a>') 
     .click(function() { 
      $(this).replaceWith('<a href="#" id="asdf">Test #2</a>') 
     }) 
     .appendTo('#result'); 
    }); 
}); 
+0

@ Russの場合、最初のコードサンプルはclickイベントを '#helult'要素ではなく '#result'要素に追加します。 – Prestaul

+0

@Prestaul - そうです。変わったことは、あなたが述べたのと同じ結果が期待されたことですが、これをdivとspanでテストしたところ、クリックイベントハンドラはhtmlコンテンツに追加された要素にバインドされていました。私は今、それを複製するように見えることはできませんので、幸せに修正するために編集します。 –

関連する問題