jQuery привязка нажмите на ссылку после вызова AJAX - PullRequest
19 голосов
/ 30 января 2011

Я в ярости - возможно, кто-то сможет помочь мне с этим.

Мне нужно повторно привязать клик к ссылке после вызова 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 ]

31 голосов
/ 30 января 2011

ОБНОВЛЕНИЕ 31 октября 2012 г.

Начиная с jQuery 1.7, рекомендуется использовать on -

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

Можете ли вы попробовать следующее?

$('.active').live('click', function()
{
    // click handler
});
21 голосов
/ 30 января 2011

Вы должны добавить привязку в обработчике success, если хотите выполнить ее после вызова Ajax:

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

Тем не менее, в данном случае live() или delegate(), вероятно, являются лучшими вариантами [ update: теперь, когда jQuery 1.7 вышел, все можно сделать с помощью .on()] . Это также предотвратит двойное назначение обработчиков кликов, если у вас есть другие .active ссылки, которые не были заменены.

Обновление: Относительно вашего обновленного кода: способ, которым вы используете live, противоречит его цели. Пожалуйста, прочитайте документацию . Что вы делаете, так это назначаете обработчик кликов при нажатии на ссылку, а это значит, что вы снова и снова добавляете обработчики кликов.

Это улучшенная версия вашего кода.

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