【问题标题】:Wrong input.checked value输入错误。检查值
【发布时间】:2021-09-12 22:57:54
【问题描述】:

我正在尝试在click 事件中记录单选元素的checked 属性。但它返回错误的值。

const radio = document.querySelector('input[type=radio]')
radio.addEventListener('click', (ev) => {
  ev.preventDefault();
  console.log(ev.target.checked);
})
<p class="rInput">
  <input type="radio" name="R" id="ID">
  <label for="ID">The label</label>
</p>

当点击收音机时,它应该记录检查状态,但它总是记录true

我对此的解决方案是添加一个 0 毫秒的 timeOut,它起作用了

const radio = document.querySelector('input[type=radio]')
radio.addEventListener('click', (ev) => {
  ev.preventDefault();
  setTimeout(() => {
    console.log(ev.target.checked);
  }, 0);
})
<p class="rInput">
  <input type="radio" id="ID">
  <label for="ID">The label</label>
</p>

但是问题出在哪里,为什么会这样?有更好的解决方案吗?

【问题讨论】:

  • 单选按钮上只有两个事件可用,即changeinput。你为什么首先在radio 按钮上使用click 事件? READ
  • 如果选中了无线电输入,它将始终为真。您是否有其他无线电输入,或者您的意思是使用复选框?
  • @pilchard 它一开始是未经检查的收音机,我使用preventDefault 来防止它更改为checked,因此我可以记录false 作为结果。
  • @Andy 我阻止它被点击检查

标签: javascript html radio-button


【解决方案1】:

禁用不想点击的单选按钮会更简单。

const radios = document.querySelectorAll('input[type="radio"]');
radios.forEach(radio => radio.addEventListener('click', handleClick, false));

function handleClick(e) {
  const { id, checked } = e.target;
  console.log(id, checked);
};
<div>
  <label for="1">First
    <input name="radio" id="1" type="radio">
  </label>
  <label for="2">Second (disabled)
    <input name="radio" id="2" type="radio" disabled>
  </label>
  <label for="3">Last
    <input name="radio" id="3" type="radio">
  </label>
</div>

【讨论】:

  • 如果收音机未选中,我正在尝试执行一些操作。如果需要,稍后将其更改为checked。如果已经检查过,请忽略点击事件。所以我需要知道无线电输入的checked 状态
【解决方案2】:

好的,这是一个有点奇怪的问题。让我试着解释一下为什么我称之为奇怪问题:

  1. 您正在单选按钮上设置 preventDefault,这将删除其默认属性(单选按钮与常规按钮的输入表单不同)。原因是常规按钮可以有多种状态,而 单选按钮只有 2 种状态,即 True 和 False。
  2. 您仅在使用 console.log(rI.checked); 按钮 isChecked 时进行检查,因此您将始终记录 TRUE

我希望这是有道理的。作为后续,我认为您应该检查(双关语)如何取消选中按钮。 This here is a great answer on how to do it using JS without any frameworks.

更新的代码片段:

$(document).ready(function(){
    $('input[type="radio"]').click(function(){
        if($(this).prop("checked") === true){
            console.log("Checkbox is checked.");
        }
        else if($(this).prop("checked") === false){
            console.log("Checkbox is unchecked.");
        }
    });
});

【讨论】:

  • 我在 click 事件上使用 preventDefault 来防止它检查单选按钮。并无论如何都记录ev.target.checked(真或假),但答案始终是true,即使它实际上没有被选中并且应该返回假。
  • @KiaAbdi 阅读我在答案底部提供的链接。这总是正确的,因为您没有取消选中它。还可以尝试运行我更新答案的代码,以便您自己查看。
  • 我阅读了您提供的链接,但找不到问题所在。收音机启动为未选中,我什至尝试在使用radio.checked = false; 添加事件侦听器之前取消选中它,但它仍然给出了错误的结果。我用你的代码检查了它(我添加了 preventDefault)。又一次......错误的结果
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 2012-09-08
  • 2011-11-04
  • 1970-01-01
  • 2016-05-07
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多