【问题标题】:JavaScript is not working for another JavaScripted input fieldsJavaScript 不适用于另一个 JavaScript 输入字段
【发布时间】:2022-01-12 10:31:27
【问题描述】:

我正在尝试在网页中使用 JavaScript 对输入字段进行自动求和。我的 javascript 函数正在部分工作。但是,.change 会在手动更改时触发,但如果由另一个 JavaScript 函数更改则不会触发。不手动改怎么触发?

<html>
    <head>
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
        <meta http-equiv="Pragma" content="no-cache">
        <meta http-equiv="Expires" content="0">
        <meta charset="utf-8">
        <link rel="icon" type="image/png" href="title-icon.png"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <style>
            input{width: 70px;text-align-last: center;}
            .icon{margin-right:3%;font-size:48px;color:red; animation-name: thi;animation-iteration-count: infinite; animation-duration: 3s;}
            @keyframes thi {from{color:red} to {color:white}}
        </style>
    </head>
    <body><br>
        <div style="margin:5%">
            <div class="row">
                <div class="col-4 border border-danger bg-primary">
                    <div class="text-center">Section A</div>
                </div>
                <div class="col-4 border border-danger bg-success">
                    <div class="text-center">Section B</div>
                </div>
                <div class="col-4 border border-danger bg-secondary">
                    <div class="text-center">Grand Total</div>
                </div>
            </div>
            <div class="row">
                <div class="col-4 border border-danger bg-primary">
                    <div class="row text-center">
                        <div class="col-4">
                            <div>Male</div>
                        </div>
                        <div class="col-4">
                            <div>Femle</div>
                        </div>
                        <div class="col-4">
                            <div>Total</div>
                        </div>
                    </div>
                    <div class="row text-center">
                        <div class="col-4">
                            <div><input type="text" class="male" id="maleA"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="female" id="femaleA"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="total" id="totalA" readonly disabled="disabled"></div>
                        </div>
                    </div>
                </div>
                
                <div class="col-4 border border-danger bg-success">
                    <div class="row text-center">
                        <div class="col-4">
                            <div>Male</div>
                        </div>
                        <div class="col-4">
                            <div>Femle</div>
                        </div>
                        <div class="col-4">
                            <div>Total</div>
                        </div>
                    </div>
                    <div class="row text-center">
                        <div class="col-4">
                            <div><input type="text" class="male" id="maleB"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="female" id="femaleB"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="total" id="totalB" readonly disabled="disabled"></div>
                        </div>
                    </div>
                </div>
                
                <div class="col-4 border border-danger bg-secondary">
                    <div class="row text-center">
                        <div class="col-4">
                            <div>Male</div>
                        </div>
                        <div class="col-4">
                            <div>Femle</div>
                        </div>
                        <div class="col-4">
                            <div>Total</div>
                        </div>
                    </div>
                    <div class="row text-center">
                        <div class="col-4">
                            <div><input type="text" class="male" id="maletotal" readonly disabled="disabled"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="female" id="femaletotal" readonly disabled="disabled"></div>
                        </div>
                        <div class="col-4">
                            <div><input type="text" class="total" id="totalall" readonly disabled="disabled"></div>
                        </div>
                    </div><br>
                </div><br>
            </div>
            <div class="row text-right">
                <div class="col-12"><i class='icon fa fa-arrow-up'></i></div>
            </div>
            <div class="row text-right">
                <div class="col-12">Total of 'Grand Total' is not working!</div>
            </div>
            <br>
        </div>
    </body>
    <script>
        $(document).ready(function()
        { // working
            $('#maleA,#femaleA').change(function()
            {
                maleA = $('#maleA').val();
                femaleA = $('#femaleA').val();
                allA = Number(maleA)+Number(femaleA);
                $('#totalA').val(allA);
            }),
            $('#maleB,#femaleB').change(function()
            {
                maleB = $('#maleB').val();
                femaleB = $('#femaleB').val();
                allB = Number(maleB)+Number(femaleB);
                $('#totalB').val(allB);
            }),

            $('#maleA,#maleB').change(function()
            {
                maleA = $('#maleA').val();
                maleB = $('#maleB').val();
                allmale = Number(maleA)+Number(maleB);
                $('#maletotal').val(allmale);
            }),
            $('#femaleA,#femaleB').change(function()
            {
                femaleA = $('#femaleA').val();
                femaleB = $('#femaleB').val();
                allfemale = Number(femaleA)+Number(femaleB);
                $('#femaletotal').val(allfemale);
            }),

            //problem is here
            $('#maletotal,#femaletotal').change(function()
            {
                allmale = $('#maletotal').val(); //feed by javascript
                allfemale = $('#femaletotal').val(); //feed by javascript
                alltotal = Number(allmale)+Number(allfemale);
                $('#totalall').val(allA);
            })
        })
    </script>
</html>

请帮助我找出错误或提出更好的解决方案。

【问题讨论】:

  • 您可以将$(input).triggerHandler('change') 添加到您的其他更改输入值的函数中吗?
  • 哦,你问和回答:)

标签: javascript jquery


【解决方案1】:

主要问题是因为以编程方式设置输入的 value 不会在 DOM 中引发事件 - 所以最后一部分中总字段上的 change 事件处理程序永远不会运行。

要纠正这个问题,您可以使用 jQuery 的 trigger() 方法在设置 val() 后在字段上手动引发 change 事件。

另外,请注意 $('#totalall').val(allA); 需要改为 $('#totalall').val(alltotal);

$(document).ready(function() { // working
  $('#maleA,#femaleA').change(function() {
      maleA = $('#maleA').val();
      femaleA = $('#femaleA').val();
      allA = Number(maleA) + Number(femaleA);
      $('#totalA').val(allA).trigger('change');
    }),
    
    $('#maleB,#femaleB').change(function() {
      maleB = $('#maleB').val();
      femaleB = $('#femaleB').val();
      allB = Number(maleB) + Number(femaleB);
      $('#totalB').val(allB).trigger('change');
    }),

    $('#maleA,#maleB').change(function() {
      maleA = $('#maleA').val();
      maleB = $('#maleB').val();
      allmale = Number(maleA) + Number(maleB);
      $('#maletotal').val(allmale).trigger('change');
    }),
    $('#femaleA,#femaleB').change(function() {
      femaleA = $('#femaleA').val();
      femaleB = $('#femaleB').val();
      allfemale = Number(femaleA) + Number(femaleB);
      $('#femaletotal').val(allfemale).trigger('change');
    }),

    //problem is here
    $('#maletotal,#femaletotal').change(function() {
      allmale = $('#maletotal').val(); //feed by javascript
      allfemale = $('#femaletotal').val(); //feed by javascript
      alltotal = Number(allmale) + Number(allfemale);
      $('#totalall').val(alltotal);
    })
})
input {
  width: 70px;
  text-align-last: center;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<div style="margin:5%">
  <div class="row">
    <div class="col-4 border border-danger bg-primary">
      <div class="text-center">Section A</div>
    </div>
    <div class="col-4 border border-danger bg-success">
      <div class="text-center">Section B</div>
    </div>
    <div class="col-4 border border-danger bg-secondary">
      <div class="text-center">Grand Total</div>
    </div>
  </div>
  <div class="row">
    <div class="col-4 border border-danger bg-primary">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" class="male" id="maleA"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="female" id="femaleA"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="total" id="totalA" readonly disabled="disabled"></div>
        </div>
      </div>
    </div>

    <div class="col-4 border border-danger bg-success">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" class="male" id="maleB"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="female" id="femaleB"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="total" id="totalB" readonly disabled="disabled"></div>
        </div>
      </div>
    </div>

    <div class="col-4 border border-danger bg-secondary">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" class="male" id="maletotal" readonly disabled="disabled"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="female" id="femaletotal" readonly disabled="disabled"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="total" id="totalall" readonly disabled="disabled"></div>
        </div>
      </div><br>
    </div><br>
  </div>
</div>

但是,您可以通过在元素上使用公共类按行为对它们进行分组来提高代码质量和可扩展性。这使得 JS 更加简洁,并且适用于无限数量的“Section”块。试试这个:

jQuery($ => {
  let $inputs = $('.input');
  let $totalMale = $('#overall-male');
  let $totalFemale = $('#overall-female');
  let $totalOverall = $('#overall-total');

  let updateRowTotal = $row => {
    let maleCount = parseInt($row.find('.male').val(), 10) || 0;
    let femaleCount = parseInt($row.find('.female').val(), 10) || 0;
    $row.find('.total').val(maleCount + femaleCount);
  }
  
  let updateOverallTotal = () => {
    let maleCount = 0;    
    $inputs.filter('.male').each((i, el) => maleCount += (parseInt(el.value, 10) || 0));
    $totalMale.val(maleCount);
    
    let femaleCount = 0;
    $inputs.filter('.female').each((i, el) => femaleCount += (parseInt(el.value, 10) || 0));
    $totalFemale.val(femaleCount);
    
    $totalOverall.val(maleCount + femaleCount);
  }

  $inputs.on('input', e => {
    updateRowTotal($(e.currentTarget).closest('.row'));
    updateOverallTotal();
  });
})
input {
  width: 70px;
  text-align-last: center;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<div style="margin:5%">
  <div class="row">
    <div class="col-4 border border-danger bg-primary">
      <div class="text-center">Section A</div>
    </div>
    <div class="col-4 border border-danger bg-success">
      <div class="text-center">Section B</div>
    </div>
    <div class="col-4 border border-danger bg-secondary">
      <div class="text-center">Grand Total</div>
    </div>
  </div>
  <div class="row">
    <div class="col-4 border border-danger bg-primary">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" class="input male"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="input female"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="total" readonly disabled="disabled"></div>
        </div>
      </div>
    </div>

    <div class="col-4 border border-danger bg-success">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" class="input male"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="input female"></div>
        </div>
        <div class="col-4">
          <div><input type="text" class="total" readonly disabled="disabled"></div>
        </div>
      </div>
    </div>

    <div class="col-4 border border-danger bg-secondary">
      <div class="row text-center">
        <div class="col-4">
          <div>Male</div>
        </div>
        <div class="col-4">
          <div>Femle</div>
        </div>
        <div class="col-4">
          <div>Total</div>
        </div>
      </div>
      <div class="row text-center">
        <div class="col-4">
          <div><input type="text" id="overall-male"></div>
        </div>
        <div class="col-4">
          <div><input type="text" id="overall-female"></div>
        </div>
        <div class="col-4">
          <div><input type="text" id="overall-total" readonly disabled="disabled"></div>
        </div>
      </div><br>
    </div><br>
  </div>
</div>

【讨论】:

    【解决方案2】:

    更改事件仅在用户操作时触发。您可以使用上述答案中提到的 .trigger 或调用以下最终方法,

    $(document).ready(function()
        { 
            $('#maleA,#femaleA').change(function()
            {
                maleA = $('#maleA').val();
                femaleA = $('#femaleA').val();
                allA = Number(maleA)+Number(femaleA);
                $('#totalA').val(allA);
                changeAllTotal();
            }),
            $('#maleB,#femaleB').change(function()
            {
                maleB = $('#maleB').val();
                femaleB = $('#femaleB').val();
                allB = Number(maleB)+Number(femaleB);
                $('#totalB').val(allB);
                changeAllTotal();
            }),
    
            $('#maleA,#maleB').change(function()
            {
                maleA = $('#maleA').val();
                maleB = $('#maleB').val();
                allmale = Number(maleA)+Number(maleB);
                $('#maletotal').val(allmale);
                 changeAllTotal();
            }),
            $('#femaleA,#femaleB').change(function()
            {
            
                femaleA = $('#femaleA').val();
                femaleB = $('#femaleB').val();
                allfemale = Number(femaleA)+Number(femaleB);
                $('#femaletotal').val(allfemale);
                changeAllTotal();
            })
            function changeAllTotal()
            {
                allmale = $('#maletotal').val(); //feed by javascript
                allfemale = $('#femaletotal').val(); //feed by javascript
                alltotal = Number(allmale)+Number(allfemale);
                $('#totalall').val(alltotal);
            }
            
        })
    

    【讨论】:

      【解决方案3】:

      诚然,以下内容可能看起来相当简洁。但它表明代码可以以更短的方式完成,使其能够处理更宽的表(不需要ids)。

      const Asum=DOMArr=>DOMArr.reduce((a,c)=>((a+=+c.value),a),0); // summation utility function
      // find arrays of males, females and their summation fields:
      const males=$(".male").get(),msum =males.pop(), females=$(".female").get(),fsum=females.pop();
      // take care of all summation fields leading to grand total: gtot
      let tots = $(".total").get(), gtot=tots.pop();
      tots = tots.map(t=>([t,$(t).closest(".row").find("input:not([readonly])").get()]));
      
      $(document).on("input","input",function(){
        [[msum,males],[fsum,females],...tots,[gtot,[msum,fsum]]].forEach(([e,a])=>e.value=Asum(a))
      })
      input {
        width: 40px;
        text-align-last: center;
      }
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
      
      <div style="margin:5%">
        <div class="row">
          <div class="col-3 border border-danger bg-primary">
            <div class="text-center">Section A</div>
          </div>
          <div class="col-3 border border-danger bg-success">
            <div class="text-center">Section B</div>
          </div>
          <div class="col-3 border border-danger bg-primary">
            <div class="text-center">Section C</div>
          </div>
          <div class="col-3 border border-danger bg-secondary">
            <div class="text-center">Grand Total</div>
          </div>
        </div>
        <div class="row">
          <div class="col-3 border border-danger bg-primary">
            <div class="row text-center">
              <div class="col-3">
                <div>Male</div>
              </div>
              <div class="col-3">
                <div>Femle</div>
              </div>
              <div class="col-3">
                <div>Total</div>
              </div>
            </div>
            <div class="row text-center">
              <div class="col-3">
                <div><input type="text" class="male" id="maleA"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="female" id="femaleA"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="total" id="totalA" readonly disabled="disabled"></div>
              </div>
            </div>
          </div>
      
          <div class="col-3 border border-danger bg-success">
            <div class="row text-center">
              <div class="col-3">
                <div>Male</div>
              </div>
              <div class="col-3">
                <div>Femle</div>
              </div>
              <div class="col-3">
                <div>Total</div>
              </div>
            </div>
            <div class="row text-center">
              <div class="col-3">
                <div><input type="text" class="male" id="maleB"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="female" id="femaleB"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="total" id="totalB" readonly disabled="disabled"></div>
              </div>
            </div>
          </div>
          
          <div class="col-3 border border-danger bg-primary">
            <div class="row text-center">
              <div class="col-3">
                <div>Male</div>
              </div>
              <div class="col-3">
                <div>Femle</div>
              </div>
              <div class="col-3">
                <div>Total</div>
              </div>
            </div>
            <div class="row text-center">
              <div class="col-3">
                <div><input type="text" class="male"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="female"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="total" readonly disabled="disabled"></div>
              </div>
            </div>
          </div>
      
          <div class="col-3 border border-danger bg-secondary">
            <div class="row text-center">
              <div class="col-3">
                <div>Male</div>
              </div>
              <div class="col-3">
                <div>Femle</div>
              </div>
              <div class="col-3">
                <div>Total</div>
              </div>
            </div>
            <div class="row text-center">
              <div class="col-3">
                <div><input type="text" class="male" id="maletotal" readonly disabled="disabled"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="female" id="femaletotal" readonly disabled="disabled"></div>
              </div>
              <div class="col-3">
                <div><input type="text" class="total" id="totalall" readonly disabled="disabled"></div>
              </div>
            </div><br>
          </div><br>
        </div>
      </div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多