<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Od wewnątrz onClickHandler
i / lub onChangeHandler
jak mogę ustalić, jaki jest nowy stan pola wyboru?
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Od wewnątrz onClickHandler
i / lub onChangeHandler
jak mogę ustalić, jaki jest nowy stan pola wyboru?
Odpowiedzi:
Krótka odpowiedź:
Użyj click
zdarzenia, które nie zostanie uruchomione, dopóki wartość nie zostanie zaktualizowana, i zostanie uruchomione, gdy chcesz:
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
Dłuższa odpowiedź:
Program change
obsługi zdarzeń nie jest wywoływany, dopóki checked
stan nie zostanie zaktualizowany ( przykład na żywo | źródło ), ale ponieważ (jak wskazuje Tim Büthe w komentarzach) IE nie uruchamia change
zdarzenia, dopóki pole wyboru nie straci ostrości, nie dostaniesz powiadomienie proaktywnie. Co gorsza, w przypadku IE, jeśli klikniesz etykietę pola wyboru (zamiast samego pola wyboru), aby go zaktualizować, możesz odnieść wrażenie, że otrzymujesz starą wartość (wypróbuj go tutaj, klikając etykietę: przykład na żywo | źródło ). Wynika to z tego, że jeśli pole wyboru jest aktywne, kliknięcie etykiety odbiera fokus, uruchamiając change
zdarzenie ze starą wartością, a następnieclick
dzieje się, ustawiając nową wartość i ponownie ustawiając fokus na polu wyboru. Bardzo mylące.
Ale możesz uniknąć tych wszystkich nieprzyjemności, jeśli zastosujesz click
zamiast tego.
Użyłem programów obsługi ( onxyz
atrybutów) DOM0, ponieważ właśnie o to pytałeś, ale dla przypomnienia ogólnie zalecałbym podłączenie programów obsługi w kodzie (DOM2 addEventListener
lub attachEvent
starszych wersjach IE) zamiast używania onxyz
atrybutów. Pozwala to na dołączenie wielu programów obsługi do tego samego elementu i pozwala uniknąć tworzenia wszystkich globalnych funkcji programów obsługi.
Wcześniejszej wersji tej odpowiedzi użyto tego kodu do handleClick
:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
Wydawało się, że celem było pozwolenie na zakończenie kliknięcia przed sprawdzeniem wartości. O ile mi wiadomo, nie ma powodu, aby to robić i nie mam pojęcia, dlaczego to zrobiłem. Wartość jest zmieniana przed click
wywołaniem modułu obsługi. W rzeczywistości specyfikacja jest dość jasna . Wersja bez setTimeout
działa idealnie dobrze w każdej przeglądarce, którą wypróbowałem (nawet IE6). Mogę tylko założyć, że myślałem o innej platformie, na której zmiana nie zostanie dokonana dopiero po wydarzeniu. W każdym razie nie ma powodu, aby to robić za pomocą pól wyboru HTML.
tab
+ space
) spowoduje również uruchomienie modułu onclick
obsługi (weryfikowane przynajmniej w Chrome 51).
W przypadku React.js możesz to zrobić za pomocą bardziej czytelnego kodu. Mam nadzieję, że to pomoże.
handleCheckboxChange(e) {
console.log('value of checkbox : ', e.target.checked);
}
render() {
return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}
onchange
działa poprawnie w+IE9
. Źródło