Viac na
Získanie hodnoty políčka HTML Checkbox z udalostí onclick/onchange
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Ako môžem v rámci onClickHandler
a/alebo onChangeHandler
zistiť, aký je nový stav zaškrtávacieho políčka?
187
3
Krátka odpoveď:
Použite udalosť
click
, ktorá sa spustí až po aktualizácii hodnoty a spustí sa, keď chcete:Živý príklad | Zdroj
Dlhšia odpoveď:
Obsluha udalosti
zmeniť
sa nevolá, kým sa neaktualizuje stavzačiarknuté
(živý príklad | zdroj), ale pretože (ako upozorňuje Tim Büthe v komentároch) IE nevyvolá udalosťzmeniť
, kým začiarkavacie políčko nestratí fokus, nedostanete proaktívne oznámenie. Horšie je, že ak v IE kliknete na štítok zaškrtávacieho políčka (a nie na samotné políčko), aby ste ho aktualizovali, môžete nadobudnúť dojem, že dostanete starú hodnotu (vyskúšajte si to v IE tu kliknutím na štítok: živý príklad | zdroj). Je to preto, že ak má zaškrtávacie políčko fokus, kliknutím na štítok sa od neho odoberie fokus, čím sa spustí udalosťzmeniť
so starou hodnotou, a potom dôjde kkliku
, ktorým sa nastaví nová hodnota a fokus sa vráti na zaškrtávacie políčko. Veľmi mätúce.Všetkým týmto nepríjemnostiam sa však môžete vyhnúť, ak namiesto toho použijete
click
.Použil som obslužné prvky DOM0 (atribúty
onxyz
), pretože ste sa na to pýtali, ale pre poriadok by som vo všeobecnosti odporúčal pripojiť obslužné prvky v kóde (DOM2'saddEventListener
aleboattachEvent
v starších verziách IE) namiesto použitia atribútovonxyz
. To vám umožní pripojiť viacero obslužných prvkov k tomu istému prvku a vyhnúť sa tomu, aby všetky vaše obslužné prvky boli globálnymi funkciami.V predchádzajúcej verzii tejto odpovede bol pre
handleClick
použitý tento kód:Zdá sa, že cieľom bolo umožniť dokončenie kliknutia pred zobrazením hodnoty. Pokiaľ je mi známe, nie je na to žiadny dôvod a netuším, prečo som to urobil. Hodnota sa zmení pred zavolaním obslužnej funkcie
click
. V skutočnosti je to v špecifikácii celkom jasne. Verzia bezsetTimeout
funguje bez problémov v každom prehliadači, ktorý som vyskúšal (dokonca aj v IE6). Môžem len predpokladať, že som myslel na nejakú inú platformu, kde sa zmena'vykoná až po udalosti. V každom prípade nie je dôvod robiť to so zaškrtávacími políčkami HTML.Použite tento
V prípade React.js to môžete urobiť pomocou čitateľnejšieho kódu. Dúfam, že to pomôže.