<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Từ bên trong onClickHandler
và / hoặc onChangeHandler
, làm cách nào tôi có thể xác định trạng thái mới của hộp kiểm là gì?
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
Từ bên trong onClickHandler
và / hoặc onChangeHandler
, làm cách nào tôi có thể xác định trạng thái mới của hộp kiểm là gì?
Câu trả lời:
Câu trả lời ngắn gọn:
Sử dụng click
sự kiện sẽ không kích hoạt cho đến khi giá trị được cập nhật và kích hoạt khi bạn muốn nó:
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
Câu trả lời dài hơn:
Trình change
xử lý sự kiện không được gọi cho đến khi checked
trạng thái được cập nhật ( ví dụ trực tiếp | nguồn ), nhưng vì (như Tim Büthe chỉ ra trong các bình luận) IE không kích hoạt change
sự kiện cho đến khi hộp kiểm mất tiêu điểm, bạn không nhận được thông báo chủ động. Tồi tệ hơn, với IE nếu bạn nhấp vào nhãn cho hộp kiểm (chứ không phải chính hộp kiểm) để cập nhật nó, bạn có thể có ấn tượng rằng bạn đang nhận được giá trị cũ (thử với IE ở đây bằng cách nhấp vào nhãn: ví dụ trực tiếp | nguồn ). Điều này là do nếu hộp kiểm có tiêu điểm, việc nhấp vào nhãn sẽ lấy tiêu điểm ra khỏi nó, kích hoạt change
sự kiện với giá trị cũ và sau đóclick
xảy ra cài đặt giá trị mới và đặt tiêu điểm trở lại vào hộp kiểm. Rất bối rối.
Nhưng bạn có thể tránh tất cả sự khó chịu đó nếu bạn sử dụng click
thay thế.
Tôi đã sử dụng trình xử lý DOM0 ( onxyz
thuộc tính) vì đó là những gì bạn đã hỏi, nhưng đối với bản ghi, tôi thường khuyên bạn nên kết nối trình xử lý trong mã (DOM2 addEventListener
, hoặc attachEvent
trong các phiên bản IE cũ hơn) thay vì sử dụng onxyz
thuộc tính. Điều đó cho phép bạn đính kèm nhiều trình xử lý vào cùng một phần tử và cho phép bạn tránh thực hiện tất cả các hàm xử lý của mình.
Một phiên bản trước của câu trả lời này đã sử dụng mã này cho handleClick
:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
Mục tiêu dường như là cho phép nhấp hoàn thành trước khi nhìn vào giá trị. Theo như tôi biết, không có lý do gì để làm điều đó, và tôi không biết tại sao tôi lại làm vậy. Giá trị được thay đổi trước khi click
trình xử lý được gọi. Trong thực tế, thông số kỹ thuật khá rõ ràng về điều đó . Phiên bản không setTimeout
hoạt động hoàn hảo trong mọi trình duyệt tôi đã thử (ngay cả IE6). Tôi chỉ có thể giả sử rằng tôi đã suy nghĩ về một số nền tảng khác mà sự thay đổi không được thực hiện cho đến sau sự kiện. Trong mọi trường hợp, không có lý do để làm điều đó với các hộp kiểm HTML.
tab
+ space
) cũng sẽ kích hoạt onclick
trình xử lý (ít nhất được xác minh trong Chrome 51).
Đối với React.js, bạn có thể làm điều này với mã dễ đọc hơn. Hy vọng nó giúp.
handleCheckboxChange(e) {
console.log('value of checkbox : ', e.target.checked);
}
render() {
return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}
onchange
làm việc chính xác trong+IE9
. Nguồn