【问题标题】:Click elsewhere and checkbox is ticked/unticked [duplicate]单击其他地方并勾选/取消勾选复选框[重复]
【发布时间】:2021-10-09 18:46:17
【问题描述】:

所以我有一段代码来创建一个包含一些数据的表。第一列包含复选框,其他列只是常规数据。

我想要的是,当我单击随机行上的任意位置(标题除外)时,整行的背景会变成黄色(最初是白色),并且该行中的复选框被勾选。如果我再次单击,该行中的所有内容都会恢复正常(白色行和未选中的复选框)。

当我在复选框上单击鼠标右键时,一切都按预期进行。但是,当我单击其他地方时,只会更改背景。我已经检查了复选框的checked 属性,并且每当我单击时它都会更改(这与正常情况一样)。我不知道为什么会这样。我浏览了许多有类似问题的帖子,但没有帮助。我只是 Javascript 和 HTML 的初学者。请帮我解决一下这个。非常感谢!

function changeColorRow(number) {
  var elem = document.getElementsByTagName("tr")[number]
  var curr_check = document.getElementsByClassName("checkbox").checked
  if (!curr_check) {
    elem.style.backgroundColor = "yellow"
    document.getElementsByClassName("checkbox").checked = true
  } else {
    elem.style.backgroundColor = "white"
    document.getElementsByClassName("checkbox").checked = false
  }
}
<h1>List of companies</h1>
<table id="company">
  <tr>
    <th>Choose</th>
    <th>ID</th>
    <th>Company</th>
    <th>Website</th>
  </tr>
  <tr onclick="changeColorRow(1)">
    <td><input type="checkbox" class="checkbox"></td>
    <td>1</td>
    <td>ECOPRO Co., Ltd</td>
    <td>http://www.ecoprovn.com</td>
  </tr>
  <tr onclick="changeColorRow(2)">
    <td><input type="checkbox" class="checkbox"></td>
    <td>2</td>
    <td>WAVINA.COM</td>
    <td>http://www.wavina.com</td>
  </tr>
</table>

【问题讨论】:

  • 这是一种方法:jsfiddle.net/v7ty0m1x
  • @ChrisG 非常感谢。我将查看该重复链接并稍后提交重复评论
  • 没有必要审查任何内容,您使用了document.getElementsByClassName("checkbox").checked,这将不起作用,因为document.getElementsByClassName("checkbox") 返回匹配元素的列表。
  • 哦,对了,谢谢你的指出。在结束这个话题之前,我可以问一个小问题吗?当我通过添加[number - 1] 将索引设置为document.getElementsByClassName("checkbox") 时,单击复选框时没有任何反应(就像其他答案一样)。这是为什么呢?

标签: javascript html checkbox


【解决方案1】:

document.getElementsByClassName 返回一个类似结构的数组,您必须使用索引来获取该索引处的特定元素。

document.getElementsByClassName("checkbox")

你可以得到点击行的索引为

index = number - 1

const allCheckbox = document.getElementsByClassName("checkbox");

function changeColorRow(number) {
  const index = number - 1;
  var elem = document.getElementsByTagName("tr")[number]
  var curr_check = document.getElementsByClassName("checkbox")[index].checked

  if (!curr_check) elem.style.backgroundColor = "yellow"
  else elem.style.backgroundColor = "white"

  allCheckbox[index].checked = !allCheckbox[index].checked
}

[...allCheckbox].forEach(cb => {
  cb.addEventListener("change", (e) => changeColorRow(parseInt(e.target.dataset.index)))
})
tr {
  cursor: default;
  user-select: none;
}
<h1>List of companies</h1>
<table id="company">
  <tr>
    <th>Choose</th>
    <th>ID</th>
    <th>Company</th>
    <th>Website</th>
  </tr>
  <tr onclick="changeColorRow(1)">
    <td><input type="checkbox" class="checkbox" data-index="1"></td>
    <td>1</td>
    <td>ECOPRO Co., Ltd</td>
    <td>http://www.ecoprovn.com</td>
  </tr>
  <tr onclick="changeColorRow(2)">
    <td><input type="checkbox" class="checkbox" data-index="2"></td>
    <td>2</td>
    <td>WAVINA.COM</td>
    <td>http://www.wavina.com</td>
  </tr>
</table>

【讨论】:

  • 点击输入时,什么也没有发生
  • 感谢您的帮助。它解决了我当前的问题。但是现在,当我单击复选框时,什么也没有发生,甚至复选框也没有勾选。此功能以前有效。你能检查你的代码吗?非常感谢!
  • 又一个坏掉的sn-p...另外,这是个骗子。
  • @JonnyJack 代码已更新。
  • @ChrisG 我同意这是 what does getElementsByClassName returns 的欺骗,但这不是 OP 面临的唯一问题。这是多个问题之一
猜你喜欢
  • 2014-03-12
  • 2017-10-17
  • 1970-01-01
  • 2015-01-08
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多