Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery elements created using .append(html) not available

Tags:

jquery

I have the following

<script>
    $(document).ready(function() {
        $(".mapLink").click(function(){
            pos = $(this).attr("id");
            alert(pos);
        });
    });
</script>

<a class="map" id="test">Test</a>

When I click on Test I get an alert...great. But I also have the following...

<script>
    $(document).ready(function() {
        $(".mapLink").click(function(){
            pos = $(this).attr("id");
            alert(pos);
        });
    });
    $(#emp").change(function(){
        $("#existingAttendTime").html('');
        $.ajax({
            url: "existingAttendTime.php?emp=" + SelValue + "&time=0",
            cache: false,
            success: function(html){
                $("#existingAttendTime").append(html);
            }
        });
    });
</script>

<a class="mapLink" id="test">Test</a>
<div id="existingAttendTime"></div>

When the emp changes it fires off and gets the results from existingAttendTime.php and inserts it into the div, so now it looks something like...

<a class="mapLink" id="test">Test</a>
<div id="existingAttendTime"><a class="mapLink" id="12345">Return Test</a></div>

Clicking on Test gets me the alert "test", but clicking on Return Test gets me nothing.

What am I doing wrong or what am I missing?

like image 742
Jason Avatar asked Jun 12 '26 19:06

Jason


2 Answers

You need to bind your click handler in 'live' mode, or else newly-added DOM nodes won't trigger it:

$(document).ready(function() {
    $(".mapLink").live("click", function(){
        pos = $(this).attr("id");
        alert(pos);
    });
});

There used to be a plugin required for live queries, but jQuery 1.3 integrated a limited version of it into core. Also note that only some event types work; change, submit, etc. will not, so you would have to explicitly attach the handler inside the same function that appended the new node to the DOM.

like image 57
rcoder Avatar answered Jun 16 '26 11:06

rcoder


Event handlers are attached on DOM ready once, if you manipulate the DOM you will need to either

  • A) manually reattach event handlers
  • B) rely on jQuery.prototype.live

It's probably more suitable to use B, so I suggest changing your click code to something like..

$("a.mapLink").live("click", function(){
    var pos = $(this).attr("id");
    alert(pos);
});

This will target any anchors that have been added through DOM manipulation.

Reference: http://docs.jquery.com/Events/live

And FYI you should be using var to declare pos in the current scope.

like image 22
meder omuraliev Avatar answered Jun 16 '26 09:06

meder omuraliev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!