jQuery绑定在AJAX调用后单击一个链接

时间:2011-01-30 09:18:23

标签: jquery bind

我很生气 - 也许有人能够帮助我。

我需要在AJAX调用后将点击重新绑定到链接,但由于某种原因它不想工作。

这是我的代码:

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;           
    });
}

有什么想法吗?

感谢您的回复 - 我修改了代码,但问题仍然存在:

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);

2 个答案:

答案 0 :(得分:31)

更新于2012年10月31日

从jQuery 1.7开始,推荐的方法是使用on -

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

您可以尝试以下方法吗?

$('.active').live('click', function()
{
    // click handler
});

答案 1 :(得分:21)

如果要在 Ajax调用之后执行,则必须在success处理程序中添加重新绑定:

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

也就是说,在这种情况下,live()delegate()可能是更好的选择[更新:>现在jQuery 1.7已经用完,所有内容都可以通过{{3 }}。如果您还有其他未被替换的.active链接,这也会阻止点击处理程序的双重分配。

更新:关于更新后的代码:您使用live的方式无法实现其目的。请阅读.on()]。你正在做的是在点击链接时分配一个点击处理程序,这意味着你一遍又一遍地添加点击处理程序。

这是您代码的改进版本。

$('.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();
});