2009-12-29 19 views
5

Tworzę mały mechanizm głosowania, który wysyła szybki znacznik bazy danych przez AJAX.Selektor klasy JQuery wciąż odpalam po removeClass

Seria przycisków z klasą "głos" jest wyzwalaczem do głosowania, a poniżej znajduje się tekst pokazujący ile "głosów" dotyczy danego przedmiotu.

Po uruchomieniu metody AJAX ze zdarzenia kliknięcia, usuwam klasę "głosowanie", tak że nie może być więcej niż jedna z tej pozycji. Jednak moim problemem jest to, że nawet po usunięciu klasy spust może nadal strzelać i zwiększać tyle głosów.

Oto HTML elementu:

 <div class="points"> 
     <img class="vote" src="images/up.gif" alt="'.$idea['id'].'"> 
     <p class="vote-'.$idea['id'].'">'.$points.' Points</p> 
    </div> 

Oto Call jQuery:

$('.vote').click(function(){ 
     var iID = $(this).attr('alt'); 
     var typeString = "id="+iID; 
     $.ajax({ 
      type: "POST", 
      url:"vote.php", 
      data: typeString, 
      success: function (txt){ 
       $('.vote-'+iID).html('<p>'+txt+' Points</p>'); 
      } 
     }); 
     $(this).attr('src', 'images/voted.gif'); 
     $(this).removeClass('vote'); 
    }); 
+1

'$ (this) .removeClass ('vote'). Unbind (" kliknij ");' – czarchaic

+2

Zgodnie z odpowiedzią meduera: możesz użyć "$ (" głos ") jQuery. , function() {}); 'zamiast kliknięcia, w ten sposób nie musisz zawracać sobie głowy wiązaniem i rozłączaniem, jeśli dynamicznie tworzysz elementy. –

Odpowiedz

5

Do odwołania do elementu DOM używany jest element class, a nie do zmiany zachowania związanego z wydarzeniem.

Aby usunąć elementy DOM, kliknij opcję użycia zdarzenia unbind.

9

Ty dołączenie obsługi zdarzeń do elementu DOM, i pozostaje nienaruszona. Możesz:

. ustaw .data('triggered', 1) w następujący sposób:

if (!$(this).data('triggered')) { 
    // do code 
    $(this).data('triggered', 1); 
} 

b.

if ($(this).hasClass('vote')) { 
    // do code 
} 

c. użyj .live zamiast .click, np. $('.foo').live('click', fn)

d. usuń ręcznie moduł obsługi zdarzeń po wywołaniu kodu, $(this).unbind('click') jako ostatni wiersz, po usunięciu bitu klasy

1

Selektor jest oceniany tylko raz, po pierwszym wywołaniu. Nie jest ponownie oceniany za każdym razem, gdy zdarzenie jest uruchamiane, aby sprawdzić, które elementy pasują; to byłoby wolne.