我有一个HTML表,最多由25行组成. 典型的一排:

function chkcountfn(required, el_id) {
  let memid = getid(el_id);
  let dateElement = "awarddate_" + memid;
  let datestr = document.getElementById(dateid).innerHTML
  let count = 0;

  // now need to go through all checkboxes with id of el_id and count those checked
  if (count >= required) {
    alert("Required number of skills acheived");
    if (datestr.length === 0) {
      var today = new Date();
      var dd = today.getDate();
      var mm = today.getMonth() + 1;
      var yyyy = today.getFullYear();
      if (dd < 10) {
        dd = '0' + dd;
      }
      if (mm < 10) {
        mm = '0' + mm;
      }
      today = dd + '/' + mm + '/' + yyyy;
      document.getElementById(dateid).innerHTML = today;
    }
  } else {
    document.getElementById(dateid).innerHTML = "";
  }
}

function getid(str) {
  var fields = str.split('_');
  var id = fields[1];
  return id;
}
<table>
  <tbody>
    <tr>
      <td id="128" name="name">Mike Starmer</td>
      <td><input type='checkbox' id='chk_128[0]' checked="checked" disabled="disabled" /></td>
      <td><input type='checkbox' id='chk_128[1]' checked="checked" disabled="disabled" /></td>
      <td><input type='checkbox' id='chk_128[2]' /></td>
      <td><input type='checkbox' id='chk_128[3]' /></td>
      <td><input type='checkbox' id='chk_128[4]' /></td>
      <td><input type='checkbox' id='chk_128[5]' checked="checked" disabled="disabled" /></td>
      <td><input type='checkbox' id='chk_128[6]' /></td>
      <td><input type='checkbox' id='chk_128[7]' /></td>
      <td><input type='checkbox' id='chk_128[8]' checked="checked" disabled="disabled" /></td>
      <td><input type='checkbox' id='chk_128[9]' /></td>
      <td id="passdate_128"> </td>
      <td id="awarddate_128"></td>
      <td hidden id="memid_128">128</td>
      <td hidden id="classid_128">7</td>
      <td hidden id="badgeid_128">7</td>
    </tr>
  </tbody>
</table>

我应该补充说,该表是使用PHP ECHO调用构建的,

我正在try 添加一个onchangeonclick事件到每个复选框将计数所有复选框在一行中,并显示一个alert ,如果超过80%的复选框被选中.

我试过在网页上搜索Java的onChange和onClick功能,但似乎都与单一的CheckBox有关.

到目前为止,我想出了以下几点:

  1. 对于每个复选框,添加一个将复选框id传递给被调用函数onclick="chkcountfn(8,this.id)"的onClick或onChange动作,8是需要选中的项数.
  2. 该函数获取传递的ID,然后解析具有该ID的所有复选框,并对选中的复选框进行计数.如果该数字= 80%,则弹出一个alert ,并将当前日期写回行"passdate_x".

老实说,我已经判断了日期替换,这是我通过搜索这个网站找到的,但没有设法测试其他任何东西.

这是我第一次try 使用HTML/Java脚本,正如您所看到的,我陷入了循环遍历复选框的部分,如果您对我做错了什么提出任何有用的意见,我也将不胜感激.此外,使用onchange或onClick事件更好,因为我了解到一些iPhone存在问题,因为它们不关联复选框和点击事件.

推荐答案

要实现只允许选中每行上80%的复选框的目标,更简单的方法是简单地获取tr个复选框中具有复选框更新的框,并将复选框总数与已选中的复选框数进行比较.

使用这种模式,您不需要任何复杂的代码来动态地定位id个属性(这应该是唯一的,仅供参考),并且还可以处理您的HTML中无限多的行.

下面是一个实用的示例:

const checkboxChangeHandler = e => {
  const cb = e.target;
  const row = cb.closest('tr');
  const checkboxes = row.querySelectorAll('input[type="checkbox"]');
  const checked = Array.from(checkboxes).filter(cb => cb.checked);
  const maxAllowed = Math.floor(checkboxes.length * 0.8); // or Math.ceil()
  
  if (checked.length > maxAllowed) {
    cb.checked = false;
    console.log('too many checkboxes selected on this row');
  }
}

document.querySelectorAll('input[type="checkbox"]').forEach(cb => cb.addEventListener('change', checkboxChangeHandler));
<table>
  <tr>
    <td id="128" name="name">Mike Starmer</td>
    <td><input type="checkbox" name="chk_128[0]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_128[1]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_128[2]" /></td>
    <td><input type="checkbox" name="chk_128[3]" /></td>
    <td><input type="checkbox" name="chk_128[4]" /></td>
    <td><input type="checkbox" name="chk_128[5]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_128[6]" /></td>
    <td><input type="checkbox" name="chk_128[7]" /></td>
    <td><input type="checkbox" name="chk_128[8]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_128[9]" /></td>
    <td id="passdate_128"> </td>
    <td id="awarddate_128"></td>
    <td hidden id="memid_128">128</td>
    <td hidden id="classid_128">7</td>
    <td hidden id="badgeid_128">7</td>
  </tr>
  <tr>
    <td id="129" name="name">Mike Starmer</td>
    <td><input type="checkbox" name="chk_129[0]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_129[1]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_129[2]" /></td>
    <td><input type="checkbox" name="chk_129[3]" /></td>
    <td><input type="checkbox" name="chk_129[4]" /></td>
    <td><input type="checkbox" name="chk_129[5]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_129[6]" /></td>
    <td><input type="checkbox" name="chk_129[7]" /></td>
    <td><input type="checkbox" name="chk_129[8]" checked="checked" disabled="disabled" /></td>
    <td><input type="checkbox" name="chk_129[9]" /></td>
    <td id="passdate_129"> </td>
    <td id="awarddate_129"></td>
    <td hidden id="memid_129">129</td>
    <td hidden id="classid_129">7</td>
    <td hidden id="badgeid_129">7</td>
  </tr>
</table>

请注意,计算包括禁用的复选框.如果它们应该被忽略,这一点很容易被修改.

Javascript相关问答推荐

React native在不首次加载时渲染的挂钩比上一次渲染期间渲染的挂钩更多

使用JavaScript/PHP将二维码保存为服务器端的图像

功能和普通对象之间的原型污染

如何在dataTables PDF输出中正确渲染字形?

我不明白这个react 组件有什么问题

创建1:1比例元素,以另一个元素为中心

如何编辑代码FlipDown.js倒计时?

获取表格的左滚动位置

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

Chrome是否忽略WebAuthentication userVerification设置?""

如何找出摆线表面上y与x相交的地方?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

JavaScript是否有多个`unfined`?

未捕获的运行时错误:调度程序为空

如何访问此数组中的值?

是否可以将异步调用与useState(UnctionName)一起使用

为什么NULL不能在构造函数的.Prototype中工作

按特定顺序将4个数组组合在一起,按ID分组