Istnieje kilka przydatnych odpowiedzi, ale żadna nie wydaje się obejmować wszystkich najnowszych opcji. W tym celu wszystkie moje przykłady uwzględniają również obecność pasujących label
elementów, a także pozwalają dynamicznie dodawać pola wyboru i wyświetlać wyniki w panelu bocznym (poprzez przekierowanie console.log
).
Nasłuchiwanie click
zdarzeń na checkboxes
to nie dobry pomysł, jako że nie pozwoli na klawiatury toggle lub zmian dokonanych w którym dopasowanie label
element został kliknięty. Zawsze nasłuchuj change
wydarzenia.
:checkbox
Zamiast tego użyj pseudo-selektora jQuery input[type=checkbox]
. :checkbox
jest krótszy i bardziej czytelny.
Użyj is()
z :checked
pseudo-selektorem jQuery , aby sprawdzić, czy pole wyboru jest zaznaczone. Gwarantuje to działanie we wszystkich przeglądarkach.
Podstawowa obsługa zdarzeń dołączona do istniejących elementów:
$('#myform :checkbox').change(function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/
Uwagi:
- Używa
:checkbox
selektora, który jest lepszy niż używanieinput[type=checkbox]
- To łączy się tylko z pasującymi elementami, które istnieją w momencie zarejestrowania zdarzenia.
Delegowana procedura obsługi zdarzeń dołączona do elementu ancestor:
Programy obsługi zdarzeń delegowanych są przeznaczone do sytuacji, w których elementy mogą jeszcze nie istnieć (ładowane dynamicznie lub utworzone) i są bardzo przydatne. Oni delegować odpowiedzialność elementu przodka (stąd nazwa).
$('#myform').on('change', ':checkbox', function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
Uwagi:
- Działa to poprzez nasłuchiwanie zdarzeń (w tym przypadku
change
), które przechodzą do niezmiennego elementu nadrzędnego (w tym przypadku #myform
).
- To wtedy stosuje się selektor jQuery (
':checkbox'
w tym przypadku) tylko do elementów w łańcuchu bąbelkowej .
- To to stosuje się funkcję obsługi zdarzeń do tylko tych elementów, które spowodowały pasujące zdarzenie.
- Posługiwać się
document
jako domyślnego, aby połączyć delegowaną procedurę obsługi zdarzeń, jeśli nic innego nie jest bliższe / wygodne.
- Nie używaj
body
do dołączania delegowanych zdarzeń, ponieważ ma to błąd (związany ze stylizacją), który może uniemożliwić mu otrzymywanie zdarzeń myszy.
Efektem delegowanych programów obsługi jest to, że pasujące elementy muszą istnieć tylko w czasie zdarzenia, a nie w momencie zarejestrowania procedury obsługi zdarzeń. Pozwala to na dynamicznie dodawane treści w celu generowania zdarzeń.
P: czy jest wolniejszy?
Odp .: Dopóki zdarzenia są z szybkością interakcji z użytkownikiem, nie musisz się martwić o znikomą różnicę w szybkości między delegowaną obsługą zdarzeń a bezpośrednio połączoną procedurą obsługi. Korzyści z delegowania znacznie przewyższają wszelkie drobne wady. Rejestrowanie delegowanych programów obsługi zdarzeń jest w rzeczywistości szybsze ponieważ zazwyczaj łączą się z pojedynczym pasującym elementem.
Dlaczego nie prop('checked', true)
odpalichange
wydarzenia?
Jest to faktycznie zgodne z projektem. Gdyby to wywołało wydarzenie, łatwo znalazłbyś się w sytuacji niekończących się aktualizacji. Zamiast tego po zmianie zaznaczonej właściwości wyślij zdarzenie zmiany do tego samego elementu za pomocą trigger
(nie triggerHandler
):
np. bez trigger
żadnego zdarzenia
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
np. z trigger
normalnym zdarzeniem zmiany
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Uwagi:
- Nie używaj
triggerHandler
zgodnie z sugestią jednego użytkownika, ponieważ nie spowoduje to wysłania zdarzeń do delegowanej procedury obsługi zdarzeń.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
chociaż będzie działać dla obsługi zdarzeń bezpośrednio połączonych z elementem:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Zdarzenia wyzwalane przez .triggerHandler () nie zwiększają hierarchii DOM; jeśli nie są obsługiwane bezpośrednio przez element docelowy, nic nie robią.
Źródła: http://api.jquery.com/triggerhandler/
Jeśli ktoś ma dodatkowe funkcje, które według niego nie są objęte tym zakresem, prosimy o zaproponowanie dodatków .
this
jest już ustawiony na element DOM pola wyboru, więcthis.checked
jest wystarczający. Nie będziesz musiał tworzyć dla niego kolejnego obiektu jQuery, chyba że planujesz nim manipulować.