复选框 .checked 属性 始终为 false

checkbox .checked property always false

出于某种原因,此代码无法正确选中复选框的 属性,而是始终为 false。我期待它显示复选框是否被选中。我错过了什么?谢谢

const clickArray = document.querySelectorAll("input")
const changeStyle = style => {
  return (() => console.log(style))
}
clickArray.forEach(
  (item, index) => {
    item.addEventListener('click', changeStyle(item.checked))
  }
)
<label for="chk1">
        <input type="checkbox" name="chk1" value="chk1">
        Bold
    </label>
<label for="chk2">
        <input type="checkbox" name="chk2" value="chk2">
        Italic
    </label>
<label for="chk3">
        <input type="checkbox" name="chk3" value="chk3">
        Underline
    </label> const click

这个元素:

<input type="checkbox" name="chk1" value="chk1">

会报告.checked = false,因为它没有属性checked。如果你想要 .checked = true 元素应该是

<input type="checkbox" name="chk1" value="chk1"  checked="checked">

注意:type=checkbox<input> 没有使用属性 value。因此,它被忽略了。它对其 .checked 属性.

没有影响

已解决,在你的情况下,函数调用正在失去上下文,当你使用事件监听器时,使用事件来执行任何检查,而不是元素,因为它会绑定旧的函数的元素上下文。

clickArray = document.querySelectorAll("input");
const changeStyle = style => {
  console.log(style);
}
clickArray.forEach(
  (item, index) => {
    item.addEventListener('click', function (e) { changeStyle(e.target.checked) })
  }
)

您可以尝试将 changeStyle() 包装在匿名函数的一侧:

var clickArray = document.querySelectorAll("input")
const changeStyle = style => {
  console.log(style);
}
clickArray.forEach(
    (item, index) => {
        item.addEventListener('click', function(){ changeStyle(this.checked)})
    }
)
<label for="chk1">
    <input type="checkbox" name="chk1" value="chk1">
    Bold
</label>
<label for="chk2">
    <input type="checkbox" name="chk2" value="chk2">
    Italic
</label>
<label for="chk3">
    <input type="checkbox" name="chk3" value="chk3">
    Underline
</label>

问题是您在调用 changeStyle 时获得 item.checked,这是在您添加事件侦听器时,而不是在事件发生时。

不是将 item.checked 传递给 changeStyle,而是传递 item,并让 changeStyle 得到 checked 属性。

const clickArray = document.querySelectorAll("input")
const changeStyle = element => {
  return (() => console.log(element.checked))
}
clickArray.forEach(
  (item, index) => {
    item.addEventListener('click', changeStyle(item))
  }
)
<label for="chk1">
        <input type="checkbox" name="chk1" value="chk1">
        Bold
    </label>
<label for="chk2">
        <input type="checkbox" name="chk2" value="chk2">
        Italic
    </label>
<label for="chk3">
        <input type="checkbox" name="chk3" value="chk3">
        Underline
    </label> const click