Click event doesn’t work on dynamically generated elements [duplicate]

The click() binding you’re using is called a “direct” binding which will only attach the handler to elements that already exist. It won’t get bound to elements created in the future. To do that, you’ll have to create a “delegated” binding by using on().

Delegated events have the advantage that they can process events from descendant elements that are added to the document at a later time.


Here’s what you’re looking for:

var counter = 0;

$("button").click(function() {
    $("h2").append("<p class="test">click me " + (++counter) + "</p>")

// With on():

$("h2").on("click", "p.test", function(){
<script src=""></script>
<button>generate new element</button>

The above works for those using jQuery version 1.7+. If you’re using an older version, refer to the previous answer below.

Previous Answer:

Try using live():

    $("h2").html("<p class="test">click me</p>")

$(".test").live('click', function(){
    alert('you clicked me!');

Worked for me. Tried it with jsFiddle.

Or there’s a new-fangled way of doing it with delegate():

$("h2").delegate("p", "click", function(){
    alert('you clicked me again!');

An updated jsFiddle.

Leave a Comment