suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Ich versuche, JavaScript zu lernen und den Durchschnitt von Schwefel und Kohlenstoff im Benutzereingabetext zu berechnen

Bitte sehen Sie sich die HTML-Tabelle unten an, um die Frage zu verstehen. Ich habe eine Tabelle erstellt und der Übersichtlichkeit halber meine Textfelder nummeriert. Ich versuche, den Durchschnitt von Texteingabe 1 (% Schwefel) und Texteingabe 2 (% Schwefel) zu berechnen und das Ergebnis in einer schreibgeschützten Texteingabe 5 (durchschnittlicher Schwefel) anzuzeigen. Das ist für Schwefel. Ich versuche auch, den Durchschnitt von Texteingabe 3 (% Kohlenstoff) und Texteingabe 4 (% Kohlenstoff) zu berechnen und die Ergebnisse in einer schreibgeschützten Texteingabe 6 (durchschnittlicher Kohlenstoff) anzuzeigen. Das ist für Kohlenstoff. Darüber hinaus möchte ich, dass JavaScript dies wiederholt durchführt, die nächsten Texteingaben in der Tabelle (Eingabe7 und Eingabe8) mittelt und das Ergebnis in der schreibgeschützten Eingabe 11 anzeigt. Die Formel sollte das Gleiche auch für die Eingaben 9 und 10 tun und das Ergebnis in der schreibgeschützten Eingabe 12 anzeigen
P粉323374878P粉323374878455 Tage vor526

Antworte allen(1)Ich werde antworten

  • P粉530519234

    P粉5305192342023-09-04 00:56:41

    如果您采用dataset属性,就可以以这样的方式关联输入和输出元素,以便可以使用任意数量的输入进行计算。下面的javascript中的注释应该解释了发生了什么

    /*
      在计算平均数时使用的实用回调函数。
      
      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>

    我知道您是JavaScript的初学者,所以您在这里看到的大部分内容可能会非常令人生畏和困惑。尽管如此,随着您的知识增加,您希望能从这里展示的一些技术中找到价值 - 但如果您有问题,可以随时提问!

    Antwort
    0
  • StornierenAntwort