J'essaie d'apprendre JavaScript et d'essayer de calculer la moyenne du soufre et du carbone dans le texte saisi par l'utilisateur.
P粉323374878
P粉323374878 2023-09-03 14:05:56
0
1
540
Veuillez vous référer au tableau HTML ci-dessous pour comprendre la question. J'ai créé un tableau et pour plus de clarté j'ai numéroté mes zones de texte. J'essaie de calculer la moyenne de la saisie de texte 1 (% de soufre) et de la saisie de texte 2 (% de soufre) et d'afficher le résultat dans une saisie de texte en lecture seule 5 (soufre moyen). C'est pour le soufre. J'essaie également de calculer la moyenne de la saisie de texte 3 (% de carbone) et de la saisie de texte 4 (% de carbone) et d'afficher les résultats dans une saisie de texte en lecture seule 6 (carbone moyen). C'est pour le carbone. De plus, j'aimerais que JavaScript fasse cela à plusieurs reprises, fasse la moyenne des entrées de texte suivantes dans le tableau (input7 et input8) et affiche le résultat dans l'entrée 11 en lecture seule. La formule doit également faire de même pour les entrées 9 et 10, affichant le résultat dans l'entrée 12 en lecture seule.
P粉323374878
P粉323374878

répondre à tous(1)
P粉530519234

Si vous prenez l'attribut dataset, vous pouvez associer des éléments d'entrée et de sortie de telle manière que les calculs puissent être effectués avec n'importe quel nombre d'entrées. Les commentaires en javascript ci-dessous devraient expliquer ce qui se passe

/*
  在计算平均数时使用的实用回调函数。
  
  reducer用于Array.reduce()方法。
  average用于Array.map()方法。
*/
const reducer=(a,c)=>a+c;
const average=(n)=>parseFloat( n.value ) / 2 || 0;


/*
  绑定到文档(或适当的父元素)的委托事件监听器
  监听并处理来自文本输入的keyup事件。在实践中,这个条件可以(应该)更加具体。
*/
const keyuphandler=(e)=>{
  if( e.target instanceof HTMLInputElement && e.target.type=='text' ){
    /*
      使用EVENT来识别感兴趣的HTML元素。
    */
    let table=e.target.closest('table');
    let tr=e.target.closest('tr');
    
    let group=tr.dataset.group;
    let elem=e.target.dataset.elem;
    /*
      使用上述变量,现在可以很容易地识别HTML中的其他元素,
      因为我们知道了dataset属性
      - 请注意,HTML具有多个data-name类型的属性,
      用于根据化学类型和表行相关输入。
      
      inputs是一个节点列表,不是数组,所以必须将其转换为数组,
      以便我们可以使用数组方法“map”和“reduce”
      这是使用“splat”或展开运算符...完成的
      
    */
    let result=table.querySelector(`tr[data-group="${group}"] input[data-elem="${elem}"].result`);
    let inputs=table.querySelectorAll(`tr[data-group="${group}"] input[data-elem="${elem}"].input`);
    /*
      使用数组方法对输入值进行计算,并将结果分配给正确标识的input.result元素。
    */
    result.value = [...inputs]
      .map( average )
      .reduce( reducer, 0 )
  }
};



document.addEventListener('keyup',keyuphandler);
table {
  width: 50px;
  box-sizing:border-box;
  border: 1px solid black;
  border-collapse: collapse;
  font-family:monospace
}
td {
  border: 1px solid black;
  padding: 0px;
  font-size: 10px;
}
th {
  border: 1px solid black;
  padding: 0px;
}
form {
  width: 4px;
}
div {
  display: grid;
}
label {
  display: block;
  width: 4px;
  font-size: 14px;
}
input [type="date"] {
  width: 4px;
}








/*
  以下仅用于美化
  示例 ;-)
*/
table {
  box-sizing:border-box;
  font-family:monospace
}
td,th{padding:0.25rem;}

[data-elem='carbon']{background:rgba(0,0,100,0.1)}
[data-elem='sulphur']{background:rgba(0,100,0,0.1)}
[readonly]{background:rgba(255,0,0,0.1)}

.input{width:3rem}
.result{width:3.5rem}
input{border:1px solid grey;padding:0.2rem;}
<!--
  注意:输入元素的名称在任何计算中都没有起作用,
  因此从以下内容中删除了这些名称。
-->

<table>
  <tr>
    <th>%<br />Sulphur</th>
    <th>%<br />Carbon</th>
    <th>Average<br />Sulphur</th>
    <th>Average<br />Carbon</th>
  </tr>
  
  <tr data-group=1>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td><input type='text' class='result' data-elem='sulphur' readonly /></td>
    <td><input type='text' class='result' data-elem='carbon' readonly /></td>
  </tr>
  <tr data-group=1>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td colspan=2>&nbsp;</td>
  </tr>
  
  <tr data-group=2>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td><input type='text' class='result' data-elem='sulphur' readonly /></td>
    <td><input type='text' class='result' data-elem='carbon' readonly /></td>
  </tr>
  <tr data-group=2>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td colspan=2>&nbsp;</td>
  </tr>
  
  <!-- 
    只需更改任何添加的附加表行对的data-group值,
    就可以轻松扩展此内容。
    例如:
    
  <tr data-group=3>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td><input type='text' class='result' data-elem='sulphur' readonly /></td>
    <td><input type='text' class='result' data-elem='carbon' readonly /></td>
  </tr>
  <tr data-group=3>
    <td><input type='text' class='input' data-elem='sulphur' /></td>
    <td><input type='text' class='input' data-elem='carbon' /></td>
    <td colspan=2>&nbsp;</td>
  </tr>
  -->
</table>

Je sais que vous êtes nouveau dans JavaScript, donc la plupart de ce que vous voyez ici peut être très intimidant et déroutant. Néanmoins, au fur et à mesure que vos connaissances se développeront, vous trouverez, espérons-le, de la valeur dans certaines des techniques présentées ici - mais si vous avez des questions, n'hésitez pas à les poser !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal