【问题标题】:JavaScript Sum Function, not working inside PHP Foreach Loop [duplicate]JavaScript Sum 函数,在 PHP Foreach 循环中不起作用 [重复]
【发布时间】:2021-12-28 03:59:27
【问题描述】:

我有一个 JavaScript 函数,它使用 id 3 个文本框来获取它们的数值,将它们加在一起,然后在最后一个文本框中给出结果。我还在我的数据库中获取人员列表,我正在使用 Foreach 行获取所有名称,然后创建 4 个文本框,用户可以输入值并获取结果。问题是我只能让第一行显示结果,其余的不显示。

<tbody>
  <?php
  if ($accao_formandos->num_rows()>0){
    foreach ($accao_formandos->result() as $row){
    ?>
    <tr>
      <td>
        <input type="text" class="form-control" name="formandos" id="formandos" onkeyup="sum();" data-fieldgroup="fg-formandos" data-error-msg="" value="<?php echo $row->nome; ?>" readonly>
      </td>
      <td>
        <input type="text" class="form-control" name="n_faltas" id="n_faltas" onkeyup="sum();" data-fieldgroup="fg-n_faltas" data-error-msg="" value="<?php //echo $n_faltas; ?>">
      </td>
      <td>
        <input type="text" class="form-control" name="assiduidade" id="assiduidade" onkeyup="sum();" data-fieldgroup="fg-assiduidade" data-error-msg="" value="<?php //echo $pauta_assiduidade; ?>">
      </td>
      <td>
        <input type="text" class="form-control" name="participacao_tarefas" id="participacao_tarefas" onkeyup="sum();" data-fieldgroup="fg-participacao_tarefas" data-error-msg="" value="<?php //echo $pauta_participacao_tarefas; ?>">
      </td>
      <td>
        <input type="text" class="form-control" name="elaboracao_trabalho" id="elaboracao_trabalho" onkeyup="sum();" data-fieldgroup="fg-elaboracao_trabalho" data-error-msg="" value="<?php //echo $pauta_elaboracao_trabalho; ?>">
      </td>
      <td>
        <input type="text" class="form-control" name="classificacao_quant" id="classificacao_quant" data-fieldgroup="fg-classificacao_quant" data-error-msg="" value="" readonly>
      </td>

    </tr>
  <?php
      }
    }
  ?>
</tbody>



function sum(result) {
            var assiduidade = document.getElementById('assiduidade').value;
            var participacao_tarefas = document.getElementById('participacao_tarefas').value;
            var elaboracao_trabalho = document.getElementById('elaboracao_trabalho').value;

            var result = (parseInt(assiduidade)*10 + parseInt(participacao_tarefas)*30 + parseInt(elaboracao_trabalho)*60) / 100;

            if (!isNaN(result)) {
                document.getElementById('classificacao_quant').value = result;
            }
        }

JavaScript 函数在正文结束时被调用,这可能会有所帮助。

我在另一篇文章中读到,document.querySelector 不起作用,因为它获取了第一个元素,但我使用的是 getElementByid,但它可能就是这样。如果有人可以帮忙,我将不胜感激

提前感谢所有帮助。

【问题讨论】:

标签: javascript php foreach


【解决方案1】:

您几乎总是可以省去 ID 属性,尤其是当您涉及循环和生成内容时。 querySelectorquerySelectorAll 与其他选择器函数(parentNode、nextSibling 等)结合使用时,可以轻松识别元素,因此您还可以省去老式的内联事件处理程序,并根据每个元素为所有元素分配外部事件侦听器下面的代码sn-p。

sn-p 使用虚拟数据作为名称和各种被认为本质上是数字的字段

document.querySelectorAll('tr input:not([data-result])').forEach(input => {
  input.addEventListener('keyup', function(e) {
    let tr = this.parentNode.parentNode;
    
    let ass = tr.querySelector('input[name="assiduidade"]');
    let par = tr.querySelector('input[name="participacao_tarefas"]');
    let ela = tr.querySelector('input[name="elaboracao_trabalho"]');
    let res = tr.querySelector('input[data-result]');

    let result = ( (Number(ass.value) * 10) + (Number(par.value) * 30) + (ela.value * 60) ) / 100;
    if (!isNaN(result) ) res.value = result;
  })
})
[type='text']{width:80px;}
<table>
  <tr>
    <td>
      <input type="text" class="form-control" name="formandos" data-fieldgroup="fg-formandos" data-error-msg="" value="Fred" readonly />
    </td>
    <td>
      <input type="text" class="form-control" name="n_faltas" data-fieldgroup="fg-n_faltas" data-error-msg="" value="" />
    </td>
    <td>
      <input type="text" class="form-control" name="assiduidade" data-fieldgroup="fg-assiduidade" data-error-msg="" value="23" />
    </td>
    <td>
      <input type="text" class="form-control" name="participacao_tarefas" data-fieldgroup="fg-participacao_tarefas" data-error-msg="" value="64" />
    </td>
    <td>
      <input type="text" class="form-control" name="elaboracao_trabalho" data-fieldgroup="fg-elaboracao_trabalho" data-error-msg="" value="41" />
    </td>
    <td>
      <input type="text" class="form-control" name="classificacao_quant" data-result=true data-fieldgroup="fg-classificacao_quant" data-error-msg="" value="" readonly />
    </td>
  </tr>
  <tr>
    <td>
      <input type="text" class="form-control" name="formandos" data-fieldgroup="fg-formandos" data-error-msg="" value="Barny" readonly />
    </td>
    <td>
      <input type="text" class="form-control" name="n_faltas" data-fieldgroup="fg-n_faltas" data-error-msg="" value="" />
    </td>
    <td>
      <input type="text" class="form-control" name="assiduidade" data-fieldgroup="fg-assiduidade" data-error-msg="" value="68" />
    </td>
    <td>
      <input type="text" class="form-control" name="participacao_tarefas" data-fieldgroup="fg-participacao_tarefas" data-error-msg="" value="21" />
    </td>
    <td>
      <input type="text" class="form-control" name="elaboracao_trabalho" data-fieldgroup="fg-elaboracao_trabalho" data-error-msg="" value="88" />
    </td>
    <td>
      <input type="text" class="form-control" name="classificacao_quant" data-result=true data-fieldgroup="fg-classificacao_quant" data-error-msg="" value="" readonly />
    </td>
  </tr>
  <tr>
    <td>
      <input type="text" class="form-control" name="formandos" data-fieldgroup="fg-formandos" data-error-msg="" value="Betty" readonly />
    </td>
    <td>
      <input type="text" class="form-control" name="n_faltas" data-fieldgroup="fg-n_faltas" data-error-msg="" value="" />
    </td>
    <td>
      <input type="text" class="form-control" name="assiduidade" data-fieldgroup="fg-assiduidade" data-error-msg="" value="88" />
    </td>
    <td>
      <input type="text" class="form-control" name="participacao_tarefas" data-fieldgroup="fg-participacao_tarefas" data-error-msg="" value="14" />
    </td>
    <td>
      <input type="text" class="form-control" name="elaboracao_trabalho" data-fieldgroup="fg-elaboracao_trabalho" data-error-msg="" value="57" />
    </td>
    <td>
      <input type="text" class="form-control" name="classificacao_quant" data-result=true data-fieldgroup="fg-classificacao_quant" data-error-msg="" value="" readonly />
    </td>
  </tr>
  <tr>
    <td>
      <input type="text" class="form-control" name="formandos" data-fieldgroup="fg-formandos" data-error-msg="" value="Wilma" readonly />
    </td>
    <td>
      <input type="text" class="form-control" name="n_faltas" data-fieldgroup="fg-n_faltas" data-error-msg="" value="" />
    </td>
    <td>
      <input type="text" class="form-control" name="assiduidade" data-fieldgroup="fg-assiduidade" data-error-msg="" value="8" />
    </td>
    <td>
      <input type="text" class="form-control" name="participacao_tarefas" data-fieldgroup="fg-participacao_tarefas" data-error-msg="" value="12" />
    </td>
    <td>
      <input type="text" class="form-control" name="elaboracao_trabalho" data-fieldgroup="fg-elaboracao_trabalho" data-error-msg="" value="88" />
    </td>
    <td>
      <input type="text" class="form-control" name="classificacao_quant" data-result=true data-fieldgroup="fg-classificacao_quant" data-error-msg="" value="" readonly />
    </td>
  </tr>
</table>

【讨论】:

    【解决方案2】:

    您的 HTML 在技术上无效。一个 ID 只能使用一次。试试这样的:

    将您的循环更改为 foreach ($accao_formandos-&gt;result() as $key =&gt; $row) 以获得每一行的唯一键。

    将您的输入更改为类似于id="assiduidade&lt;?= $key ?&gt;" onkeyup="sum(&lt;?= $key ?&gt;);",以便它们都有唯一的 ID,并将密钥传递给您的函数。

    你的函数的原型应该变成function sum(key)(你以前从来没有向它传递过参数,所以那里的“结果”没有做任何事情)。

    最后更改每个元素引用以包含键,例如getElementById('assiduidade' + key)

    【讨论】:

    • 完美运行,我知道 ID 是唯一的,但我尝试了其他一些东西,但效果不佳,但我喜欢你修复它的简单方法,非常感谢
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多