2011-05-19 4 views
16

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

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

не уверен, что, если он не имеет ничего общего с тем, почему ее не работает.

+0

Куда вы разместили свое заявление о несвязанности? –

+0

@George независимо, '.unbind ('click')' не будет работать, потому что слушатель был связан с '.live()' not '.click()' или '.bind ('click')'. –

ответ

34

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

Это хорошо. Спасибо. –

+0

Это хорошее решение, если вы также установили requestRunning false при ошибке ajax. Без этого он не будет работать после ошибки. – Leons

+0

@Leons Очень хорошая точка. Обновлено с помощью 'complete'. – lonesomeday

3

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

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

+0

Это работает, но я понял, что предложение lonesomeday в моем случае немного лучше. –

1

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

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

}); 
1

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

11

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

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

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

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

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

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

}); 
0

Мое решение, работая глобальным по всему АЯКС запроса, если активен запрос, новый с тем же 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); 
} 
}); 
0

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

$('element').off() 

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

0

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

$('button id or classs').one('click',function(){  
}); 
Смежные вопросы