<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Von innen onClickHandler
und / oder onChangeHandler
wie kann ich den neuen Status des Kontrollkästchens ermitteln?
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Von innen onClickHandler
und / oder onChangeHandler
wie kann ich den neuen Status des Kontrollkästchens ermitteln?
Antworten:
Die kurze Antwort:
Verwenden Sie das click
Ereignis, das erst nach der Aktualisierung des Werts ausgelöst wird und wann immer Sie möchten:
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
Die längere Antwort:
Der change
Ereignishandler wird erst aufgerufen, wenn der checked
Status aktualisiert wurde ( Live-Beispiel | Quelle ), aber weil (wie Tim Büthe in den Kommentaren hervorhebt) der IE das change
Ereignis erst auslöst, wenn das Kontrollkästchen den Fokus verliert, erhalten Sie es nicht die Benachrichtigung proaktiv. Schlimmer noch, wenn Sie mit IE auf eine Beschriftung für das Kontrollkästchen (und nicht auf das Kontrollkästchen selbst) klicken , um es zu aktualisieren, können Sie den Eindruck gewinnen, dass Sie den alten Wert erhalten (versuchen Sie es mit IE hier, indem Sie auf die Beschriftung klicken: Live-Beispiel | Quelle ). Dies liegt daran, dass wenn das Kontrollkästchen den Fokus hat, durch Klicken auf die Beschriftung der Fokus entfernt wird und das change
Ereignis mit dem alten Wert ausgelöst wirdclick
passiert, indem der neue Wert gesetzt und der Fokus wieder auf das Kontrollkästchen gesetzt wird. Sehr verwirrend.
Aber Sie können all diese Unannehmlichkeiten vermeiden, wenn Sie click
stattdessen verwenden.
Ich habe DOM0-Handler verwendet (onxyz
Attribute) verwendet, weil Sie danach gefragt haben, aber für den Datensatz würde ich generell empfehlen, Handler in Code (DOM2 addEventListener
oder attachEvent
in älteren Versionen von IE) einzubinden , anstatt onxyz
Attribute zu verwenden. Auf diese Weise können Sie mehrere Handler an dasselbe Element anhängen und vermeiden, dass alle Handler globale Funktionen haben.
In einer früheren Version dieser Antwort wurde dieser Code verwendet für handleClick
:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
Das Ziel schien zu sein, den Klick zu vervollständigen, bevor der Wert betrachtet wurde. Soweit mir bekannt ist, gibt es keinen Grund dafür, und ich habe keine Ahnung, warum ich das getan habe. Der Wert wird geändert, bevor der click
Handler aufgerufen wird. In der Tat ist die Spezifikation ziemlich klar darüber . Die Version ohne setTimeout
funktioniert perfekt in jedem Browser, den ich ausprobiert habe (sogar IE6). Ich kann nur vermuten, dass ich über eine andere Plattform nachgedacht habe , auf der die Änderung erst nach dem Ereignis vorgenommen wird. In jedem Fall kein Grund, dies mit HTML-Kontrollkästchen zu tun.
tab
+ space
) umschalten, wird auch der onclick
Handler ausgelöst (zumindest in Chrome 51 überprüft).
Für React.js können Sie dies mit besser lesbarem Code tun. Ich hoffe es hilft.
handleCheckboxChange(e) {
console.log('value of checkbox : ', e.target.checked);
}
render() {
return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}
onchange
funktioniert das richtig in+IE9
. Quelle