从 onclick/onchange 事件中获取 HTML 复选框的值

Getting value of HTML Checkbox from onclick/onchange events

提问人:Maxim Gershkovich 提问时间:12/17/2010 最后编辑:Maxim Gershkovich 更新时间:12/31/2022 访问量:812344

问:

<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />

从内部和/或,如何确定复选框的新状态是什么?onClickHandleronChangeHandler

JavaScript HTML 事件 DOM 复选框

评论


答:

480赞 T.J. Crowder 12/17/2010 #1

简短的回答:

使用该事件,该事件在更新值之前不会触发,并在您希望它时触发:click

<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>

function handleClick(cb) {
  display("Clicked, new value = " + cb.checked);
}

现场示例 |

更长的答案:

在更新状态之前,不会调用事件处理程序(实时示例 |source),但由于(正如 Tim Büthe 在评论中指出的那样)IE 不会触发事件,直到复选框失去焦点,您就不会主动收到通知。更糟糕的是,在 IE 中,如果您单击复选框的标签(而不是复选框本身)来更新它,您可能会得到您正在获得旧值的印象(通过单击标签在此处尝试使用 IE:实时示例 |来源)。这是因为,如果复选框具有焦点,则单击标签会将焦点从它身上移开,使用旧值触发事件,然后设置新值并将焦点设置回复选框上。非常令人困惑。changecheckedchangechangeclick

但是,如果您改用,则可以避免所有这些不愉快。click

我使用了 DOM0 处理程序(属性),因为这就是你问的,但为了记录,我通常建议在代码(DOM2 或旧版本的 IE)中挂接处理程序,而不是使用属性。这样,您就可以将多个处理程序附加到同一元素,并避免使所有处理程序成为全局函数。onxyzaddEventListenerattachEventonxyz


此答案的早期版本将此代码用于:handleClick

function handleClick(cb) {
  setTimeout(function() {
    display("Clicked, new value = " + cb.checked);
  }, 0);
}

目标似乎是在查看值之前允许点击完成。据我所知,没有理由这样做,我也不知道我为什么要这样做。在调用处理程序之前更改该值。事实上,规范对此非常清楚。没有的版本在我尝试过的每个浏览器(甚至是 IE6)中都运行良好。我只能假设我正在考虑其他一些平台,直到事件发生后才进行更改。无论如何,没有理由对 HTML 复选框这样做。clicksetTimeout

评论

9赞 Mori 1/26/2014
幸运的是,在 中正常工作。onchange+IE9
0赞 dah97765 8/6/2014
在这里添加我的 2 美分:似乎 IE8(以及我假设的更低版本)区分了点击下放和点击释放......我们之所以出现在这个页面上,是因为它是在点击时触发的,而不是在点击发布时触发的。似乎复选框仅在单击释放时激活 - 单击下方然后移动鼠标会记录单击,但不会修改复选框。
3赞 Nate Whittaker 6/18/2016
看起来通过键盘导航 (+) 切换复选框也会触发处理程序(至少在 Chrome 51 中已验证)。tabspaceonclick
0赞 user7350714 5/18/2017
如何在单击该复选框时获取该复选框的值??
12赞 Farhan 3/8/2017 #2

使用这个

<input type="checkbox" onclick="onClickHandler()" id="box" />

<script>
function onClickHandler(){
    var chk=document.getElementById("box").value;

    //use this value

}
</script>

评论

3赞 Per Lindberg 6/17/2022
.value 总是给出 'on',使用 .checked 给出 'true' 或 'false'。
40赞 Pakpoom Tiwakornkit 6/17/2019 #3

对于 React.js,您可以使用更具可读性的代码来执行此操作。希望它有所帮助。

handleCheckboxChange(e) {
  console.log('value of checkbox : ', e.target.checked);
}
render() {
  return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}

评论

0赞 Mark Willow Aldave 7/15/2021
你能帮我解决这个问题吗:stackoverflow.com/questions/68386737/......我想这就是我需要的,但不知道如何正确地做到这一点。
0赞 Pakpoom Tiwakornkit 7/16/2021
@MarkWillowAldave对不起,我没有使用 Next.js
2赞 Sarfraz Rasheed 12/29/2021 #4
use onclick event on all checkboxes that you want to get their values whether they are checked or not.

<input type="checkbox" value="rightSideCheckbox" onclick='handleClick(this);'>

function handleClick(checkbox) {
    if(checkbox.checked){
        console.log(checkbox.value+"True")
    }
    else{
        console.log(checkbox.value+"False")
    }
}
-1赞 Lokesh KC 12/30/2022 #5
 
const [checkboxval, setCheckboxVal] = React.useState(null);

const handleChangeCheckbox = (e) => {
   setCheckboxVal(e.target.checked);
}


render() {
   return <input type="checkbox" onChange={(e) => handleChangeCheckbox(e)}
}

评论

0赞 Community 12/30/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。