2010-01-07 6 views
27

tutaj jest moja htmljQuery kliknij zdarzenie jest wypalanie wielokrotnie przy użyciu selektora klasy

<li><div class="myLink" id=1>A<div> 
<li><div class="myLink" id=2>b<div> 
<li><div class="myLink" id=3>c<div> 
<li><div class="myLink" id=4>d<div> 
<li><div class="myLink" id=5>d<div> 
<li><div class="myLink" id=6>e<div> 
<li><div class="myLink" id=7>d<div> 
<li><div class="myLink" id=8>g<div> 

I stworzył powiązania zdarzeń jquery wnioskach ten kod:

jQuery(".myLink").click(function(event) { 

     var myId = this.id; 

     location.href = '/x/y?myId=' + myID; 
    }); 

po kliknięciu na jeden z linków (przedmioty LI). Myślałem, że to wystrzeli jedno kliknięcie i kiedy zadzwonię do this.id, po prostu dostanę ten identyfikator przedmiotu, który kliknąłem.

Ale zamiast to wygląda:

jQuery(".myLink").click(function(event) { 

jest wypalanie w kółko nawet, że ja po prostu kliknie jeden link. Włożyłem oświadczenie debuggera i użyłem firebuga i zobaczyłem, że to się w kółko nawołuje.

Jakieś pomysły, co się dzieje?

Odpowiedz

17

Jeśli zamkniesz swoje tagi <li>, rozwiążesz problem. Właśnie to przetestowałem i to poprawia. Powinny być

<li> ... </li> 
<li> ... </li> 

nie

<li> 
<li> 
+0

Miałem podobny problem z tagiem img, więc @Erik ma rację. Sądzę, że każdy tag powinien mieć tag zamykający, aby pozbyć się tego problemu. –

6

Spróbuj wpisać wartość atrybutu id w cudzysłowach. Dziwne rzeczy dzieją się, gdy po prostu umieszczasz id=1.

Ponadto, skąd wiadomo, że uruchamia się wiele razy? Ta linia umieścić górną część funkcji i oglądać Firebug zalogować, aby zobaczyć, co się dzieje:

console.log("clicked on", jQuery(this), "which has id", jQuery(this).attr('id')); 

edit:

Heh, jak inni zwrócili uwagę ... Upewnij się, że znaczniki są zbyt ważne : P

+0

Zgoda. Użyj id = "1", id = "2", id = "3" itp. – PHLAK

+7

Polecam również prawidłowe zamknięcie twoich elementów div i li. – alex

+1

posiadanie atrybutu ID w tagach nie przyniesie efektu, tylko FYI – Erik

1

Z opublikowanego HTML wygląda na to, że DIV myLink są zagnieżdżone, powodując wielokrotne wystrzeliwanie zdarzenia, ponieważ każde DIV jest klikane. Jak już wspomniano, upewnij się, że znaczniki są dobrze uformowane. Czy znaczniki DIV na końcu każdego wiersza powinny blokować znaczniki?

+0

bić mnie do ciosu :) – Erik

+0

Nie jesteś sam ... – zehrer

69

miałem podobny problem i rozwiązanie dla mnie było rozpiąć zdarzenia click przed oświadczając zdarzenia click. Nie ma to większego sensu, ale nie miałem pojęcia, jak wiele wydarzeń dołącza się do pojedynczego elementu HTML. (I mój HTML wyglądał ważne;))

$ ('remove_lkc '.) Rozpiąć (' kliknięcie') kliknij (function() {..........

+0

Miałem problem opisany w OP, ale mój HTML był dobrze sformułowany. Naprawiona poprawka opublikowana przez @ user512568 zadziałała dla mnie. Dziękuję za udostępnienie. – groundh0g

+8

Jeśli to naprawiło, prawdopodobnie po pewnym czasie ponownie wiązało się zdarzenie kliknięcia. Re-binding podstawy są omawiane tutaj: http://www.learningjquery.com/2008/05/working-with-events-part-2 – Riko

+0

Miał podobny problem. $ (". class"). on ("click", function() {}); stosował tylko detektory zdarzeń do każdego innego elementu. Nie wiem, dlaczego, ale pierwsze rozłączenie wydaje się naprawić. Dziękuję Ci! –

6

Mój problem polegał na tym, że podczas tworzenia <div> s miałem wiążące zdarzenie w pętli, co powoduje wielokrotne dodawanie zdarzenia dla każdego elementu zdarzenia.

+2

Dokładnie ten problem. Używałem selektora klasy $ (". Class") .Kliknij (function()) wewnątrz pętli, więc dodałem wiele procedur obsługi kliknięć w każdej iteracji pętli. Upewnij się, że twój program obsługi .click jest ustawiony poza pętlą. – user1507720

14

W moim przypadku, miałem wiele kart renderowania samo częściowe i każdy częściowy miał $ (document). wywołanie ready(), które trzykrotnie wiązało zdarzenie click.

+4

D'oh! Wstawiłem js na szczyt częściowego szablonu, żeby go przetestować podczas pracy nad nim i to było cztery razy. Gdybym podrapał się w głowę, inne komentarze nie pasowałyby do mojej sytuacji, więc dziękuję za zwrócenie uwagi! Całkowicie zapomniałem, że używałem szablonu w innych zakładkach ... –

+0

Czuję się tak głupi, teraz –

1

Upewnij się, że skrypt js nie jest dołączany wiele razy. jeśli używasz frameworka w witrynie serwera, upewnij się, że układ i szablony nie zawierają tego samego skryptu.

4

W moim przypadku javascript musi być renderowany wraz z zapytaniem ajax.

$(document).ready(function(){ 
    $(document).on('click','.className',function(){alert('hello..')}) 
}); 

Zdarzenie opalane wiele czasu .. wykorzystywane .off() usunąć wszystkie poprzednie obsługi zdarzeń. (wykorzystanie sam podpis używany w .Na())

$(document).ready(function(){ 
    $(document).off('click','.className'); 
    $(document).on('click','.className',function(){alert('hello..')}); 
}); 

Nadzieja pomaga kogoś ...

+0

Dzięki! Działa jak urok, oszczędzasz mój dzień –

+0

mój drugi, dzięki @ buris .. –

+0

Dziękuję! Uratowałem też mój dzień – FastTrack