2009-07-24 8 views
13

ubiegać:Dlaczego moja obsługa kliknięć jQuery wydaje się uruchamiana wiele razy w przypadku niektórych jej celów?

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
}); 

Na tym:

<span id="contents"> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content1" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content3" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content4" class="content category"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
</span> 

Dlaczego po kliknięciu na pierwszych 2 przyciski Dodaje 111, następny przycisk dodaje 11 a ostatni dodaje 1?

+1

spróbować apending A "

" zamiast po prostu "1", –

+0

Gdzie jest # # # test? Może to jest coś z tym kodem? – MacAnthony

Odpowiedz

20

Nie można powtórzyć. Podejrzewam, że wprowadzasz w błąd sytuację, w której nadmiernie upraszczasz, głównie —. Mówiąc dokładniej, uważam, że dynamicznie dodajesz te dane wejściowe i wywołujesz $(".newContentLink").click(...) za każdym razem, gdy —, które, oczywiście, nadal stosuje dodatkowe kopie obsługi kliknięć do każdego .newContentLink na stronie.

Ostatnie utworzone dane wejściowe mają jedną kopię obsługi kliknięcia i dołączają jeden numer 1. Drugi najnowszy ma dwie kopie i dołącza 11. Trzeci ma trzy i dołącza 111 itp

Aby tego uniknąć, należy zastosować procedurę obsługi kliknij, aby nowo utworzonego elementu DOM, nie $(".newContentLink") (co zawsze oznacza każdy.newContentLink).

+4

Tak, prawie na pewno dodawana jest obsługa "kliknięć". – Blixt

+2

Lub użyj metody .live() do dynamicznego dodawania zdarzenia – MacAnthony

1

Spróbuj podać różne nazwy elementów wejściowych przesyłania.

+0

Chciałbym, ale są one utworzone w pętli przez mój skrypt (tylko umieszczam to, co mam nadzieję, jest odpowiednią częścią kodu tam). – Eliyahu

+1

Jestem po prostu zaniepokojony, że może to mieć coś wspólnego z udaną definicją kontroli. – EFraim

2

nie błąd jQuery - Working Demo

Musi być problem z czegoś innego w kodzie. Gdzie jest element z id="test" w twoim znaczniku?

EDIT:

Wystarczy przeczytać chaos' answer, który brzmi jak spójnego wyjaśnienia.

przy okazji, identyfikatory element musi być unikalna w obrębie znaczników HTML - jest częścią specyfikacji HTML i może być kolejnym możliwym wytłumaczeniem

6

Jak chaos says, jesteś prawdopodobnie nazywając click() każdym razem, gdy dodasz i gromadzą się.

Jeśli dodajesz te elementy do dokumentu w sposób dynamiczny i musisz upewnić się, że ta funkcja jest dodawana do każdego dodawanego przez ciebie elementu, a co z używaniem live?

$('#contents').on('click', '.newContentLink', function() { 
    $("#test").append("1"); 
}); 

Spowoduje to, że reguła będzie stosowana dynamicznie jeden raz do dowolnej klasy kwalifikacyjnej w dokumencie.

+0

Whoops, MacAnthony już to zasugerował. –

+2

Wierzę, że składnia powinna być .live ("kliknij", funkcja() { – MacAnthony

+0

Ten kod nie działa dla mnie.Sprawdziłem dokumenty, a to zrobiło: $ (". NewContentLink"). Live ("kliknij ", function() {$ (" # test "). append (" 1 ");}); – Eliyahu

1

Miałem podobny problem ... Wyliczyłem, że stosowałem funkcję zmiany w pętli ... tj. mój kod był wcześniej ....

$("table#UserIRTable > tbody > tr").each(function() 
{ 
    .............. 
    .............. 

    $("input[id='thisMonthSupply']").change(function(e){ 
     ...... 
    }); 
    .......... 
    .......... 
} 

objął funkcję zmiany na zewnątrz i bingo ... to działało .....

2

Aby upewnić się, że funkcja wykonać tylko raz na jednym kliknięciem imprezy ty może użyć $ (". newContentLink").jeden();

$(".newContentLink").one(function() { 
    $("#test").append("1"); 
}); 
7

lub można rozpiąć zdarzenia click każdym dodaniu nowego elementu

$('.newContentLink').unbind('click'); 

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
}); 
Powiązane problemy