Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery binding click to a link after AJAX call

Tags:

jquery

bind

I'm getting furious - perhaps someone will be able to help me with this.

I need to re-bind the click to the link after AJAX call, but for some reason it doesn't want to work.

Here's my code:

if ($('.active').length > 0) {
    $('.active').click(function() {
        var elem = $(this);
        var url = $(this).attr('href');
        $.ajax({
            url: url,
            dataType: 'html',
            success: function(data) {
                elem.replaceWith(data);                                                     
            }       
        });         
        $('.active').bind('click'); return false;           
    });
}

Any idea?

Thanks for the responses - I've amended the code, but the problem is still there:

function makeActive() {
    if ($('.active').length > 0) {
        $('.active').click(function() {
            var elem = $(this);
            var url = $(this).attr('href');
            $.ajax({
                url: url,
                dataType: 'html',
                success: function(data) {
                    elem.replaceWith(data);                             
                }       
            }); 
            $('.active').live('click', makeActive);     
            return false;           
        });
    }
}


$('.active').live('click', makeActive);
like image 497
user398341 Avatar asked Jan 30 '11 09:01

user398341


People also ask

Why does click event not work after Ajax load?

If you use AJAX on your website, beware that events like click, submit, hover might not work if you don't attach them properly. I will be using click event to describe the problem, but all of this applies to most events in jQuery.

How do you bind events on Ajax loaded content?

You need to use the event delegation for Ajax generated content using jQuery. Use jQuery delegation to attach an event in the dynamically created content by Ajax. The following code snippet shows you how to add/bind/use the jQuery click event on Ajax generated elements.

How run JavaScript after loading Ajax?

When the link li#menu-item-318 a gets clicked it removes the ready class which then reverses the css transition and then loads a new html document. On the Aja load I once again want to add the ready class to the same elements inserted by the Ajax call. The code below has a callback to add the ready class, which works.

How can I call document ready function after Ajax call?

You could always just put everything in one function (named loadfunction or something) and call that function when the document loads, and again when the ajax is loaded. Though it is a hacked together solution, it should work well enough. function OnloadFunction () { alert("test"); } $(document). ready(OnloadFunction);


2 Answers

UPDATE on October 31, 2012

Starting from jQuery 1.7, the recommended approach is to use on -

$(document).on('click', '.active', function () {
    // click handler code goes here
});

Can you try the following ?

$('.active').live('click', function()
{
    // click handler
});
like image 140
MD Sayem Ahmed Avatar answered Oct 21 '22 20:10

MD Sayem Ahmed


You would have to add the rebinding in the success handler if you want to execute it after the Ajax call:

success: function(data) {
    elem.replaceWith(data);
    $('.active').bind('click', /* some function needs to go here*/);
}

That said, in this case, live() or delegate() are probably better options [update: now that jQuery 1.7 is out, everything can be done with .on()]. This would also prevent double assignment of click handlers, in case you have other .active links that have not been replaced.

Update: Regarding your updated code: The way you are using live defeats its purpose. Please read its documentation. What you are doing is assigning a click handler when the the link is clicked, which means that you are adding click handlers over and over again.

This is an improved version of your code.

$('.active').live('click', function(event) {
    var elem = $(this);
    var url = $(this).attr('href');
     $.ajax({
         url: url,
         dataType: 'html',
         success: function(data) {
              elem.replaceWith(data);                             
         }       
     });    
     event.preventDefault();
     event.stopPropagation();
});
like image 22
Felix Kling Avatar answered Oct 21 '22 19:10

Felix Kling