Подтвердить что ты не робот

Отключить функцию jquery после 1 щелчка, чтобы предотвратить несколько исполнений

У меня есть следующая функция, которая извлекает больше комментариев за пределы 20, которые отображаются по умолчанию

$('.more_comments_link').live('click', function() {
        $(".more_comments_link").text("Fetching More Comments ...");

        var ajaxOpts = {
            type: "get",
            url: "ajax_getcomments.php",
            dataType: 'json',
            data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
            success: function(data) {
                $('.discussion-more').after(data);
                $(".discussion-more").hide();
            }
        };

        $.ajax(ajaxOpts);
        return false;
    }); 

он работает, единственная проблема заключается в том, что пользователь может быстро нажать кнопку 3 раза, и он отправит 3 запроса на ajax_getcomments.php, каждый раз получая одинаковый результат.

Я попробовал добавить

$(".more_comments_link").unbind('click');

но он ничего не делает.

Исходный набор результатов также загружается с помощью jquery, поэтому Im использует .live(click'

не уверен, имеет ли он какое-либо отношение к тому, почему он не работает.

4b9b3361

Ответ 1

live не работает с unbind - вам нужно die.

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

var requestRunning = false;
$('.more_comments_link').live('click', function () {
    if (requestRunning) { // don't do anything if an AJAX request is pending
        return;
    }

    $(".more_comments_link").text("Fetching More Comments ...");

    var ajaxOpts = {
        type: "get",
        url: "ajax_getcomments.php",
        dataType: 'json',
        data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["
        data "]["
        e_creator "]; ?>&more=1",
        success: function (data) {
            $('.discussion-more').after(data);
            $(".discussion-more").hide();
        },
        complete: function() {
            requestRunning = false;
        }

    };

    requestRunning = true;
    $.ajax(ajaxOpts);
    return false;
});

Ответ 2

Все эти решения сложны для очень простого решения; используйте .one() в соответствии с документацией здесь:

http://api.jquery.com/one/

Просто измените live на one. См. Ниже:

$('.more_comments_link').one('click', function() {

Ответ 3

Вы можете использовать .die() для отвязывания событий .live().

Или установите флаг в другом месте, в котором говорится, что запрос выполняется, и проверьте, что в начале обработчика кликов.

Ответ 4

Попробуйте использовать отключенное ключевое слово. Таким образом, вам не нужно отменить функцию, вы просто отключите ее от нажатия:

$('.more_comments_link').live('click', function() {
    $(this).attr("disabled", true);
    $(".more_comments_link").text("Fetching More Comments ...");

    var ajaxOpts = {
        type: "get",
        url: "ajax_getcomments.php",
        dataType: 'json',
        data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
        success: function(data) {
            $('.discussion-more').after(data);
            $(".discussion-more").hide();
        }
    };

    $.ajax(ajaxOpts);
    return false;
}); 

Ответ 5

В зависимости от вашего варианта использования вам может не понадобиться live, и в этом случае one будет делать именно то, что вы хотите.

Ответ 6

$('.more_comments_link').live('click', function(e) {

    if($(e.target).data('oneclicked')!='yes') {

        $(this).text("Fetching More Comments ...");

        var ajaxOpts = {
            type: "get",
            url: "ajax_getcomments.php",
            dataType: 'json',
            data: "&itemid=<? echo $id; ?>&type=1&owner=<? echo $event["data"]["e_creator"]; ?>&more=1",
            success: function(data) {
                $('.discussion-more').after(data);
                $(".discussion-more").hide();
            }
        };

        $.ajax(ajaxOpts);
        return false;
    }

    $(e.target).data('oneclicked','yes');

}); 

Ответ 7

Для меня это сработало:

$('.more_comments_link').live('click', function() {

if(e.handled !== true) // This will prevent event firing more than one time
{
  e.handled = true;
  //your code here...
}

});

Ответ 8

Мое решение, работающее глобально по всему запросу ajax, если это активный запрос, новый с тем же URL-адресом будет прерван. Хорошо работает.

var activeRequests = [];

$(document).ajaxComplete(function(e, jqxhr, settings) {
    var i = activeRequests.indexOf(settings.url);
    if (i != -1) {

    setTimeout(function(){ activeRequests.splice(activeRequests.indexOf(settings.url), 1); }, 75);

}
});

$(document).ajaxSend(function(e, jqxhr, settings) {
var i = activeRequests.indexOf(settings.url)
if (i != -1) {
    jqxhr.abort();
    activeRequests.push(settings.url);
}
});

Ответ 9

Вы можете использовать:

$('element').off()

Это отключит любое событие вашего компонента, который вы слушаете.

Ответ 10

Вы можете использовать один клик по кнопке над веб-страницей

 $('button id or classs').one('click',function(){    
 });