2011-05-19 15 views
16

Mam następujący funkcja, która pobiera więcej komentarzy poza 20, które są wyświetlane domyślnieWyłącz Funkcja jQuery po 1 kliknięcie, aby zapobiec wielu egzekucji

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

to działa, tylko problem jest, użytkownik może kliknąć przycisk 3 razy bardzo szybko i wyśle ​​3 zapytania do ajax_getcomments.php, uzyskując za każdym razem ten sam wynik.

próbowałem dodając

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

ale nic nie robi.

Początkowy zestaw wyników jest pobierany z jQuery również, stąd Im przy .live(click'

nie wiem, czy to ma coś wspólnego z tym, dlaczego jej nie działa.

+0

Gdzie umieściłeś swoje niepowiązane oświadczenie? –

+0

@George niezależnie, '.unbind ('click')' nie zadziała, ponieważ słuchacz był związany z '.live()' nie '.click()' lub '.bind ('kliknięcie')'. –

Odpowiedz

34

live nie działa z unbind - trzeba die zamiast.

Jednak istnieje lepsze rozwiązanie, jeśli chodzi o. Ponieważ prawdopodobnie chcesz, aby móc aktualizować zawartość więcej niż jeden raz, można ustawić zmienną, aby zobaczyć, czy wniosek jest aktualnie uruchomione:

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

To jest dobre. Dziękuję Ci. –

+0

jest to dobre rozwiązanie, jeśli ustawiono również wartość parametru requestRunning false, gdy błąd ajax. Bez tego nigdy nie zadziała po błędzie. – Leons

+0

@Leons Bardzo dobry punkt. Zaktualizowano zamiast tego 'complete '. – lonesomeday

3

Możesz użyć .die(), aby usunąć zdarzenia .live().

Albo ustawić flagę innym miejscu mówi, że wniosek jest w toku i sprawdzić, czy na początku procedury obsługi kliknięcia.

+0

To działa, ale zdałem sobie sprawę, że sugestia Lonesomeday jest nieco lepsza w moim przypadku. –

1

Spróbuj użyć wyłączonego słowa kluczowego. W ten sposób nie trzeba rozpiąć funkcji, po prostu go wyłączyć przed wciśnięty:

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

zależności od przypadku użycia, może nie trzeba użyj live, w takim przypadku one zrobi dokładnie to, co chcesz zrobić.

11

Wszystkie te rozwiązania są daleko skomplikowane w przypadku bardzo prostego rozwiązania; używać .one() zgodnie z dokumentacją tutaj:

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

Wystarczy zmienić live do one. Patrz poniżej:

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

Dla mnie to działało:

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

moje rozwiązanie, pracujący na całej globalnej ajax żądanie, jeśli jest aktywny żądanie, nowy z tym samym adresem URL zostanie przerwana. Dobrze pracować.

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

Można użyć:

$('element').off() 

ten będzie wyłączyć dowolne zdarzenie ze swojego urządzenia, które są słuchanie

0

można użyć za pomocą jednego kliknięcia na przycisk na stronie

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