Szukam uogólnionego rozwiązania tego problemu.
Rozważ 2 wejścia radiowe o tej samej nazwie. Po przesłaniu sprawdzany określa wartość wysyłaną z formularzem:
<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />
Zdarzenie zmiany nie jest uruchamiane, gdy przycisk opcji jest wyłączony. Jeśli więc radio o wartości = „1” jest już wybrane, a użytkownik wybierze drugie, uchwytChange1 () nie działa. To stanowi problem (dla mnie zresztą) polegający na tym, że nie ma zdarzenia, w którym mógłbym złapać to usunięcie zaznaczenia.
To, co chciałbym, to obejście zdarzenia onchange dla wartości grupy pól wyboru lub alternatywnie zdarzenie oncheck, które wykrywa nie tylko, gdy radio jest zaznaczone, ale także, gdy nie jest zaznaczone.
Jestem pewien, że niektórzy z was wcześniej napotkali ten problem. Jakie są obejścia (lub idealnie, jak to zrobić)? Chcę tylko złapać zdarzenie zmiany, uzyskać dostęp do wcześniej sprawdzonego radia, a także nowo sprawdzonego radia.
PS
onclick wydaje się lepszym zdarzeniem (przeglądarkowym) do wskazania, kiedy radio jest sprawdzane, ale nadal nie rozwiązuje problemu niezaznaczonego.
Podejrzewam, że ma sens, dlaczego onchange dla typu pola wyboru działa w takim przypadku, ponieważ zmienia wartość, którą przesyła, gdy go zaznaczasz lub odznaczasz. Chciałbym, żeby przyciski radiowe zachowywały się bardziej jak wymiana elementu SELECT, ale co możesz zrobić ...
źródło
myRadios
aby odczytać zmienną,prev
która zawiera aktualnie wybrane radio. W ramach każdej procedury obsługi kliknięć dokonuje się porównania, aby zdecydować, czy kliknięte radio jest takie samo, jak zapisane wprev
radiu, a jeśli nie, wówczas przechowywane w nim radio jest przechowywane. W module obsługi kliknięć masz dostęp do poprzednio wybranego:prev
i aktualnie wybranego radia:this
rad[i].addEventListener('change', function(){ //your handler code })
i będzie działał zarówno na myszy, jak i na klawiaturzeDokonałbym dwóch zmian:
onclick
Zamiast tego użyj procedury obsługionchange
- zmieniasz „stan zaznaczony” wejścia radiowego, a nievalue
, więc nie dzieje się żadne zdarzenie zmiany.this
jako parametr, który ułatwi sprawdzenie, która wartość jest aktualnie wybrana.ETA: Wraz z
handleClick()
funkcją możesz śledzić oryginalną / starą wartość radia w zmiennej o zasięgu strony. To jest:źródło
onclick
obsługi został po prostu źle nazwany - obsługuje zdarzenie wyboru przycisku radiowego, niezależnie od tego, czy przycisk zostanie kliknięty, dotknięty, czy aktywowany poprzez naciśnięcie klawisza „enter” na klawiaturze. Proceduraonchange
obsługi nie jest w tym przypadku odpowiednia, ponieważ wartość danych wejściowych się nie zmienia, tylko atrybut zaznaczony / niezaznaczony. Dodałem przykładowy skrypt, aby rozwiązać poprzednią wartość.Jak widać z tego przykładu: http://jsfiddle.net/UTwGS/
HTML:
jQuery:
zarówno zdarzenia, jak
click
ichange
zdarzenia są uruchamiane po wybraniu opcji przycisku opcji (przynajmniej w niektórych przeglądarkach).Powinienem również zauważyć, że w moim przykładzie
click
zdarzenie jest nadal uruchamiane, gdy używasz klawisza tab i klawiatury, aby wybrać opcję.Chodzi mi o to, że chociaż
change
zdarzenie jest uruchamiane w niektórych przeglądarkach,click
powinno ono zapewniać wymagany zasięg.źródło
console.log
w moim kodzie znajduje się instrukcja, której IE7 nie obsługuje. Możesz po prostu zaalarmować w IE, jeśli chcesz.click
ichange
procedury obsługi zdarzeń, dwukrotnie wywołujesz procedurę obsługi zdarzeń. W tym przypadku, ponieważ @Matthew dotyczy poprzedniej wartości, może to prowadzić do złych konsekwencji.click
jest tu poprawnym przewodnikiem i jedynym, którego potrzebujesz. Twoja poprawka wyjaśnia to, dlatego usuwam mój głos negatywny.Co powiesz na użycie zdarzenia zmiany Jquery?
jsfiddle: http://jsfiddle.net/f8233x20/
źródło
$(this).val()
można również zastąpić rodzimym javascripte.currentTarget.value
, gdzie e jest obiektem zdarzenia przekazywanym przez funkcję wywołania zwrotnego.Jak widać tutaj: http://www.w3schools.com/jsref/event_onchange.asp Atrybut onchange nie jest obsługiwany dla przycisków opcji.
Pierwsze połączone przez Ciebie pytanie SO daje odpowiedź: użyj
onclick
zdarzenia i sprawdź stan przycisku opcji w funkcji, którą uruchamia.źródło
onclick
nie jest tym samym semantycznym, ponieważ można zmienić sprawdzanie przycisku opcji poprzez wprowadzanie danych z klawiatury przy włączonym wyborze formy klawiatury.Nie sądzę, że istnieje inny sposób niż przechowywanie poprzedniego stanu. Oto rozwiązanie z jQuery
Po głębszym przemyśleniu postanowiłem pozbyć się zmiennej i dodać / usunąć klasę. Oto, co dostałem: http://jsfiddle.net/BeQh3/2/
źródło
Tak, nie ma zdarzenia zmiany dla aktualnie wybranego przycisku opcji. Problem polega jednak na tym, że każdy przycisk opcji jest traktowany jako osobny element. Zamiast tego grupa radiowa powinna być uważana za pojedynczy element, taki jak
select
. Tak więc dla tej grupy uruchamiane jest zdarzenie zmiany. Jeśli jest toselect
element, nigdy nie martwimy się o każdą z zawartych w nim opcji, ale bierzemy tylko wybraną opcję. Przechowujemy bieżącą wartość w zmiennej, która stanie się poprzednią wartością, gdy zostanie wybrana nowa opcja. Podobnie musisz użyć oddzielnej zmiennej do przechowywania wartości zaznaczonego przycisku opcji.Jeśli chcesz zidentyfikować poprzedni przycisk opcji, musisz zapętlić
mousedown
zdarzenie.zobacz to: http://jsfiddle.net/diode/tywx6/2/
źródło
Przechowuj poprzednio sprawdzone radio w zmiennej:
http://jsfiddle.net/dsbonev/C5S4B/
HTML
JS
JS PRZYKŁADOWY KOD
źródło
Zdaję sobie sprawę, że to stary problem, ale ten fragment kodu działa dla mnie. Być może ktoś w przyszłości uzna to za przydatne:
źródło
onkeydown="radioChange('juju','button1',radioArray);"
możesz także przechwytywać, gdy użytkownik wykorzystuje miejsce do sprawdzenia radia.Jest to tuż przy mojej głowie, ale możesz zrobić zdarzenie onClick dla każdego przycisku opcji, nadać im różne identyfikatory, a następnie zrobić pętlę for, aby przejść przez każdy przycisk opcji w grupie i znaleźć, który jest został sprawdzony poprzez sprawdzenie atrybutu „sprawdzone”. Identyfikator sprawdzanego będzie przechowywany jako zmienna, ale możesz najpierw użyć zmiennej tymczasowej, aby upewnić się, że wartość tej zmiennej się zmieni, ponieważ zdarzenie click uruchomi się, niezależnie od tego, czy zaznaczono nowy przycisk opcji.
źródło
źródło
Jeśli chcesz uniknąć wbudowanego skryptu, możesz po prostu słuchać zdarzenia kliknięcia w radiu. Można to osiągnąć za pomocą zwykłego Javascript, słuchając zdarzenia kliknięcia na
źródło
Możesz dodać następujący skrypt JS
źródło
to działa dla mnie
źródło
Jest to najłatwiejsza i najbardziej wydajna funkcja, wystarczy dodać tyle przycisków, ile chcesz do zaznaczonego = false i ustawić zdarzenie onclick dla każdego przycisku opcji. Wyznacz unikalny numer dla każdego przycisku opcji
źródło
Najłatwiejsza i pełna moc
tylko do odczytu wejścia radiowe za pomocą getAttribute
źródło