2013-02-08 13 views
9

Po dodaniu jednego wyboru do etykiety i powiązania dla zdarzenia kliknięcia jQuery uruchamia się dwa razy.Kliknięcie wiązania jQuery dla etykiety wypalanie dwa razy

http://jsfiddle.net/d8Ax7/

html:

<label class="lol"> 
    <div> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

javascript:

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
    } 
}) 

Jak można rozwiązać ten problem bez dodawania "dla" atrybutem etykiet?

+0

interesujące. Wygląda na to, że możesz używać tylko treści frazowania w tagu etykiety, który nie zawiera elementów div. [Źródło] (https://developer.mozilla.org/en-US/docs/HTML/Content_categories#Phrasing_content) –

+0

wyzwalacz ubuntu/firefox raz w skrzypcach – mikakun

+0

działa zgodnie z oczekiwaniami po wybraniu tylko pierwszego div wewnątrz '$ ("label.lol div: first") ' – sofl

Odpowiedz

5

Wiem, że istnieje już wiele odpowiedzi na to pytanie, ale są one niejasne.

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
     return false; 
    } 
}); 

Ok, wszyscy docenili. Problem rozwiązany. Ale pytanie powstaje Dlaczego return false;.

Odpowiedź W prostych słowach: Jest to sposób informowania komputera, że ​​powrót z funkcji, zadanie, które ci dałem jest zakończone. Nigdy więcej bałaganu.

+0

dzięki Aspiring Aquib; zadziałało. Co myślisz, że to błąd? –

+0

Kliknięcie zdarzenia propaguje lub spiętrza DOM, co powoduje, że jest uruchamiany dwukrotnie. Jeden na swoim i inny znacznik wyboru (lub dowolne inne elementy formularza) pomiędzy nimi. Możesz zobaczyć to skrzypce: http://jsfiddle.net/5QAS2/ ** Co tam jest? ** Zobacz, że gdy 'input' lub jakikolwiek inny tag znajduje się pomiędzy elementem etykiety, funkcja działa dwa razy. I nie ma, gdy elementy formy nie są w nim. Nie zrobiłem żadnych badań na ten temat. Tak więc nie potrafię wyjaśnić więcej lub nie mogę powiedzieć, że jest to błąd lub coś takiego. Tak! –

+0

Inną rzeczą jest to, że jeśli alarm powinien trzykrotnie powiadomić o dwóch wejściach. Który to nie robi. Patrz: http://jsfiddle.net/5QAS2/1/ Tak, myślę, że to błąd. Nie możemy powiedzieć, że bulgotanie DOM. Cóż, proponuję, abyś zwrócił "false", kiedy piszesz program. –

0
$("label.lol").off("click").on(//... 

ale czy to wypalanie dwukrotnie na pewno oznacza, że ​​związały go dwa razy więc korzystanie .off jest bardziej hack niż najlepsze rozwiązanie problemu, które byłoby zrozumieć, jak skończy się ta impreza wiązanie dwukrotnie .. . & pewno kod pokazać nie wyjaśnia tej podwójnej niewoli

edit: & w skrzypcach to rzeczywiście nie wywołać tylko raz ...

2

można spróbować użyć, aby go połączyć etykiety „za” atrybut do wyboru poza nim. Zobacz mój przykład

<label for="test" class="lol"> 
    <div> 
     bla 
    </div> 
</label> 

<div style="display:none;"> 
    <select id="test"></select> 
</div> 

http://jsfiddle.net/d8Ax7/1/

+0

Cytat: "Jak mogę naprawić ten błąd bez dodawania atrybutu" for "do etykiet?" – sofl

+0

Ah, przepraszam, po prostu zwróć false z obsługi: http://jsfiddle.net/d8Ax7/3/ –

+0

cóż, ahh, czy aktualizujesz swoją odpowiedź? To jest dobre. I @sofl używa 'return false;' zawsze w swoim kodzie. –

0

ten sposób działa też, ale nie jestem do końca rozumiem co próbujesz zrobić ... I etykieta powinna zawierać tylko tekst etykiety select i nie zawierają się wybrać ..

$("label.lol div:first").on({ 
     click : function() 
     { 
      alert(1); 
     } 
    }) 
0

Istnieją dwie opcje, gdy przesłanianie kliknij sprawdzić ten stack overflow pytanie do bardziej szczegółowo, ale Podsumowując spróbować ...

$("label.lol").click(function() { 
     alert(1); 
     return false; 
}); 
0

Twój znacznik jest okropny. Twoim problemem jest to, że jquery wykonuje zdarzenie click na każdym div w twojej funkcji etykiety - oznacza to dwa razy. Powinieneś wyczyścić znaczniki ur i poprosić div, że chcesz być klikalnym bezpośrednio. Else Zastosowanie: po pierwsze, aby upewnić się, że zdarzenie jest zwolniony tylko raz:

$('.lol div:first').click(function() 
{ 
    alert("1"); 
}) 
+0

Masz rację co do znaczników. Ale wydarzenie jest wywołane na etykiecie. Spróbuj zastąpić 'alert (" 1 ")' z 'alert (this)' i zobaczysz, że pokazuje on '[obiekt HTMLLabelElement]' dwa razy. – fragmentedreality

0

Należy dodać e.preventDefault();

$("label.lol").on({ 
    click : function (e) 
    { 
    alert(1); 
    e.preventDefault(); 
    } 
}); 
0

Twój problem polega na rozróżnieniu elementów.g należy wybrać pierwsze dziecko etykiety z :first-child selektora, albo dać mu id:

HTML:

<label class="lol"> 
    <div id="first-child"> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

JS:

$("#first-child").on('click',function(){ 
     alert(1); 
}); 

http://jsfiddle.net/d8Ax7/5/

0

Spróbuj filtrować za pomocą CSS: Dodaj int ermediate klasa clicked, która zapobiega drugiemu alarmowi (lub cokolwiek akcji), a następnie usuwa .clicked, aby być gotowym do następnej rundy.

$("label.lol").on({ 
    click : function() 
    { 
     if (! $(this).hasClass('clicked')) 
      alert(1); 
     $(this).toggleClass('clicked'); 
    } 
}) 
Powiązane problemy